固然,有不少很好的JSON解析的JAR包,好比JSONOBJECT,GSON,甚至也有为咱们测试人员而打造的JSONPATH,但我仍是自已实现了一下(以前也实现过,如今属于重构)。git
思想是这样的,以这个JSON串为例:String j = "{\"a\":\"b\",\"c\\\"b\":{\"a\":1},\"d\":[\"a\",{\"a\":3},{\"a\":2},\"\"],\"e\":\"b\"}";github
咱们在保证只扫描一次字符串的状况下,就把JSON串解析成功。因而,我先定义了一个List: private List<Object> collections = new ArrayList<Object>();json
collections用来存放这个JSON串中全部的LIST与MAP,在扫描时,一旦碰到{或[,就new一个Map或List,而后add到collections中去了:数据结构
存放进去后,咱们须要一个map来记录collections里的list或map的状态,好比是否已经闭合了,是一个list仍是一个map,在collections中的index:private Map<String, Map<String, Integer>> index = new HashMap<String, Map<String, Integer>>();测试
能够看到,这个MAP的key是由1 1.1 1.2 1.1.1这样来组成的,因此,这个key就能够用来表示json的层级结构了,固然我还用了一个list来保存这些key的顺序:private List<String> level = new ArrayList<String>();对象
这样一来,数据结构就很清晰了。接下来要作的事,就是在扫描中的一些判断了,保持如下几个点:blog
1.碰到[或{就new一个对象,并将对象存放到collections中去字符串
2.碰到'\\'须要转义的,得直接跳过去,并存放到扫描出来的临时变量中去。好比\\{就不须要new一个对象同步
3.碰到"符号,就要打个标记,在下一个"出现以前,把扫描出来的都当成一个字符串放到临时变量中去。博客
4.碰到:符号,就要开始标记是个map的开始了,并把以后出现的字符串都存放到另外一个临时变量中去。
5.碰到,符号,就要开始处理临时变量了,若是是map就把以前存的两个昨时变量,一个做为KEY,一个做为VALUE,都放到collections中对应的map中去,若是是list,则把以前存的第一个临时变量,放到collections对应的list中去。
6.碰到]或}符号,则表示一个list或map被解析彻底了,则这时候要去更新index中的对应的list或map的状态了。
解析完了后,全部的数据都在collections index level这三个变量中了,因而,咱们只须要定一个取数据的规则就好了,我用的是一种相似于xpath的语法格式来取值的,这时候只须要解析下这个xpath路径就能够得出这个key,而后在collections中拿值就能够了!
如下是代码下载地址:
http://files.cnblogs.com/files/zhangfei/zson.rar
贴一下使用方法:
备注:上面的例子中,咱们能够看到,XPATH只支持绝对路径(代码都有,你们能够扩展成相对路径),用*[]来表示一个list,用map的key来找其value!
GITHUB地址:https://github.com/zhangfei19841004/zson
最新的更新及说明,都会在github上进行,不会同步至博客园,因此,须要最新代码的,请点击上面的连接!
有兴趣的能够看看,若是有任何问题,均可以联系我!