JSON字符串转换为对象_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > JSON字符串转换为对象

JSON字符串转换为对象

 2014/6/29 21:41:06  dieslrae  程序员俱乐部  我要评论(0)
  • 摘要:作为前言,首先是要吐槽一下公司的脑残编译部署方式,web和core分开部署本来没什么问题,但是这丫居然不把json的包作为基础包而作为web的包,导致了core端不能使用,而且我们的core是可以当web来用的(不要在意这些细节),所以在core中处理json串就是个问题.没办法,跟编译那帮人也扯不清楚,只有自己写json的解析了.思路还是将json的解析拆分为两类,一类为Object,解析为map,一类为Array,解析为list.先谈Object的,比如是一个这样的串:{aa:bb,cc:
  • 标签: 字符串 JSON JS
    作为前言,首先是要吐槽一下公司的脑残编译部署方式,web和core分开部署本来没什么问题,但是这丫居然不把json的包作为基础包而作为web的包,导致了core端不能使用,而且我们的core是可以当web来用的(不要在意这些细节),所以在core中处理json串就是个问题.没办法,跟编译那帮人也扯不清楚,只有自己写json的解析了.
    思路还是将json的解析拆分为两类,一类为Object,解析为map,一类为Array,解析为list.
    先谈Object的,比如是一个这样的串:{aa:bb,cc:{dd:ee,ff:gg}},不管它的层次有多深,先将其拆分为key1:value1,key2:value2,然后再根据value的startsWith是否是{或者来[来判断要不要递归.
    Array的思路也跟Object类似,只是拆分为value1,value2...来处理.

    还是上代码吧

将字符串解析为map的
class="java" name="code">
public Map<String,Object> parseMap(String str){
		Map<String, Object> map = new HashMap<>();
		
		str = str.replaceAll("(^\\{)|(\\}$)","");//处理掉前后的{}
		Stack<String> stack = new Stack<>();//定义一个栈来存value的深度,以便能准去的截取到value截止的坐标
		
		for(int begin=0,end=0;end<str.length();end++){
			if((str.charAt(end) + "").equals(":")){
				String key = str.substring(begin,end);
				
				for(begin=++end;end<=str.length();end++){
					//如果value中有{或者[就压入栈
					if(end < str.length() && ((str.charAt(end) + "").equals("{") || (str.charAt(end) + "").equals("["))){
						stack.push(str.charAt(end) + "");
						continue;
					}
					
					//有}或者]就从栈中弹出一个
					if(end < str.length() && ((str.charAt(end) + "").equals("}") || (str.charAt(end) + "").equals("]"))){
						stack.pop();
					}
					
					//当栈为空,又便利到逗号的时候就认为value已经结束
					if((end == str.length() || (str.charAt(end) + "").equals(",")) && stack.size() == 0){
						Object value = str.substring(begin,end);
						//根绝value的开始字符来判断是否需要递归
						if(value.toString().startsWith("{")){
							map.put(key, parseMap(value.toString()));
						}else if(value.toString().startsWith("[")){
							map.put(key, parseList(value.toString()));
						}else{
							map.put(
								key.replaceAll("(^\")|(\"$)|(^')|('$)",""), 
								value.toString().replaceAll("(^\")|(\"$)|(^')|('$)",""));
						}
						
						begin = end +1;
						break;
					}
				}
			}
		}
		
		return map;
	}


字符串解析为list
public List<Object> parseList(String str){
		List<Object> list = new ArrayList<Object>();
		
		str = str.replaceAll("(^\\[)|(\\]$)","");
		Stack<String> stack = new Stack<>();
		
		for(int begin=0,end=0;end<=str.length();end++){
			if(end < str.length() && ((str.charAt(end) + "").equals("{") || (str.charAt(end) + "").equals("["))){
				stack.push(str.charAt(end) + "");
				continue;
			}
			
			if(end < str.length() && ((str.charAt(end) + "").equals("}") || (str.charAt(end) + "").equals("]"))){
				stack.pop();
			}
			
			if((end == str.length() || (str.charAt(end) + "").equals(",")) && stack.size() == 0){
				Object value = str.substring(begin,end);
				
				if(value.toString(). startsWith("{")){
					list.add(parseMap(value.toString()));
				}else if(value.toString().startsWith("[")){
					list.add(parseList(value.toString()));
				}else{
					list.add(value.toString().replaceAll("(^\")|(\"$)|(^')|('$)",""));
				}
				
				begin = end + 1;
			}
		}
		
		return list;
	}


json转成字符串
@SuppressWarnings("unchecked")
	public String JSON2String(Map<String,?> map){
		StringBuilder str = new StringBuilder();
		
		for(String key : map.keySet()){
			str.append("\"").append(key).append("\":");
			
			Object value = map.get(key);
			
			if(value instanceof Map){
				str.append(JSON2String((Map<String,?>)value)).append(",");
			}else if(value instanceof List){
				str.append(JSON2String((List<?>)value)).append(",");
			}else{
				str.append("\"").append(value).append("\",");
			}
		}
		
		return "{" + str.substring(0,str.length() - 1) + "}";
	}
	
	@SuppressWarnings("unchecked")
	public String JSON2String(List<?> list){
		StringBuilder str = new StringBuilder();
		
		for(Object value :list){
			if(value instanceof Map){
				str.append(JSON2String((Map<String,?>)value)).append(",");
			}else if(value instanceof List){
				str.append(JSON2String((List<?>)value)).append(",");
			}else{
				str.append("\"").append(value).append("\",");
			}
		}
		
		return "[" + str.substring(0,str.length() - 1) + "]";
	}
  • 相关文章
发表评论
用户名: 匿名