JSON文字列をオブジェクトに変換

4994 ワード

前言として、まず会社の脳障害のコンパイル配置方式にツッコミを入れます.webとcoreを分けて配置するのはもともと問題ありませんが、jsonのバッグをベースにしないでwebのバッグとして、core端が使えなくなりました.そして、私たちのcoreはwebとして使えるので(これらの細部は気にしないでください)、coreでjson列を処理するのが問題です.仕方なく、コンパイルの連中とははっきり言えず、自分でjsonの解析を書くしかない.
考え方はやはりjsonの解析を2種類に分割して、1種類は
Object,解析为map,一类为
Array,listと解析する.
まずObjectについて話します.例えば、{aa:bb,cc:{dd:ee,ff:gg}}という列です.その階層がどんなに深くても、
まずkey 1:value 1,key 2:value 2に分割してからvalueのstartsWithが{かどうかを判断する
再帰
Arrayの考え方もObjectと似ていますが、value 1、value 2に分割されています.処理する
やはりコードをつけましょう
文字列をmapの

public Map<String,Object> parseMap(String str){
		Map<String, Object> map = new HashMap<>();
		
		str = str.replaceAll("(^\\{)|(\\}$)","");//      {}
		
		for(int begin=0,end=0,brackets=0;end<str.length();end++){
			if((str.charAt(end) + "").equals(":")){
				String key = str.substring(begin,end);
				
				for(begin=++end;end<=str.length();end++){
					if(end < str.length() && ((str.charAt(end) + "").equals("{") || (str.charAt(end) + "").equals("["))){
						brackets++;
						continue;
					}
					
					if(end < str.length() && ((str.charAt(end) + "").equals("}") || (str.charAt(end) + "").equals("]"))){
						brackets--;
					}
					
					if((end == str.length() || (str.charAt(end) + "").equals(",")) && brackets == 0){
						String value = str.substring(begin,end);
						
						if(value.startsWith("{")){
							map.put(key, parseMap(value));
						}else if(value.startsWith("[")){
							map.put(key, parseList(value));
						}else{
							map.put(
								key.replaceAll("^[\",']|[\",']$",""), 
								value.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,brackets=0;end<=str.length();end++){
			if(end < str.length() && ((str.charAt(end) + "").equals("{") || (str.charAt(end) + "").equals("["))){
				brackets++;
				continue;
			}
			
			if(end < str.length() && ((str.charAt(end) + "").equals("}") || (str.charAt(end) + "").equals("]"))){
				brackets--;
			}
			
			if((end == str.length() || (str.charAt(end) + "").equals(",")) && brackets == 0){
				String value = str.substring(begin,end);
				
				if(value.toString(). startsWith("{")){
					list.add(parseMap(value));
				}else if(value.toString().startsWith("[")){
					list.add(parseList(value));
				}else{
					list.add(value.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) + "]";
	}