JSON字符串转换为对象

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

还是上代码吧

将字符串解析为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) + "]";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值