Java 不使用工具包把json更快的转化为map


转化成map,也有可能是list哦,当然如果你写的不是符合json格式的数据当然会有错误。我这么写有点不好理解,关键是几次出栈,当然可以封装一个类专门来表示,限于篇幅就直接用map和list了

/**
*
 * @param jsonstring
 * @return
*/
@SuppressWarnings("unchecked")
public static Object json2Map(String jsonstring){

Stack<Map> maps=new Stack<Map>(); //用来表示多层的json对象
Stack<List> lists=new Stack<List>(); //用来表示多层的list对象
Stack<Boolean> islist=new Stack<Boolean>();//判断是不是list
Stack<String> keys=new Stack<String>(); //用来表示多层的key

String keytmp=null;
Object valuetmp=null;
StringBuilder builder=new StringBuilder();
char[] cs=jsonstring.toCharArray();

for (int i = 0; i < cs.length; i++) {

switch (cs[i]) {
case '{': //如果是{map进栈
maps.push(new HashMap());
islist.push(false);
break;
case ':'://如果是:表示这是一个属性建,key进栈
keys.push(builder.toString());
builder=new StringBuilder();
break;
case '[':
islist.push(true);
lists.push(new ArrayList());
break;
case ','://这是一个分割,因为可能是简单地string的键值对,也有可能是string=map
//的键值对,因此valuetmp 使用object类型;
//如果valuetmp是null 应该是第一次,如果value不是空有可能是string,那是上一个键值对,需要重新赋值
//还有可能是map对象,如果是map对象就不需要了

boolean listis=islist.peek();

if(builder.length()>0)
valuetmp=builder.toString();
builder=new StringBuilder();
if(!listis){
keytmp=keys.pop();
maps.peek().put(keytmp, valuetmp);
}else
lists.peek().add(valuetmp);

break;
case ']':
islist.pop();

if(builder.length()>0)
valuetmp=builder.toString();
builder=new StringBuilder();
lists.peek().add(valuetmp);
valuetmp=lists.pop();
break;
case '}':
islist.pop();
//这里做的和,做的差不多,只是需要把valuetmp=maps.pop();把map弹出栈
keytmp=keys.pop();

if(builder.length()>0)
valuetmp=builder.toString();

builder=new StringBuilder();
maps.peek().put(keytmp, valuetmp);
valuetmp=maps.pop();
break;
default:
builder.append(cs[i]);
break;
}

}
return valuetmp;
}

--------------------------------------分割线 --------------------------------------

Struts中异步传送XML和JSON类型的数据

Linux下JSON库的编译及代码测试

jQuery 获取JSON数据[$.getJSON方法]

用jQuery以及JSON包将表单数据转为JSON字符串

在C语言中解析JSON配置文件

--------------------------------------分割线 --------------------------------------

本文永久更新链接地址:

相关内容