JSON文字列をオブジェクトに変換
前言として、まず会社の脳障害のコンパイル配置方式にツッコミを入れます.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の
文字列をlistに解析
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) + "]";
}