Java自已设计JSON解析器
作者:网络转载 发布时间:[ 2015/12/23 10:10:19 ] 推荐标签:编程语言 测试开发技术
当然,有很多很好的JSON解析的JAR包,比如JSONOBJECT,GSON,甚至也有为我们测试人员而打造的JSONPATH,但我还是自已实现了一下(之前也实现过,现在属于重构)。
思想是这样的,以这个JSON串为例:String j = "{"a":"b","c\"b":{"a":1},"d":["a",{"a":3},{"a":2},""],"e":"b"}";
我们在保证只扫描一次字符串的情况下,把JSON串解析成功。于是,我先定义了一个List: private List<Object> collections = new ArrayList<Object>();
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>();
这样一来,数据结构很清晰了。接下来要做的事,是在扫描中的一些判断了,保持以下几个点:
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!
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11