JAVA自已设计JSON解析器
当然,有很多很好的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!
GITHUB地址:https://github.com/zhangfei19841004/zson
最新的更新及说明,都会在github上进行,不会同步至博客园,所以,需要最新代码的,请点击上面的链接!
有兴趣的可以看看,如果有任何问题,都可以联系我!
JAVA自已设计JSON解析器的更多相关文章
- Jackson:我是最牛掰的 Java JSON 解析器(有点虚)
在当今的编程世界里,JSON 已经成为将信息从客户端传输到服务器端的首选协议,可以好不夸张的说,XML 就是那个被拍死在沙滩上的前浪. 很不幸的是,JDK 没有 JSON 库,不知道为什么不搞一下.L ...
- 一起写一个JSON解析器
[本篇博文会介绍JSON解析的原理与实现,并一步一步写出来一个简单但实用的JSON解析器,项目地址:SimpleJSON.希望通过这篇博文,能让我们以后与JSON打交道时更加得心应手.由于个人水平有限 ...
- 这个东西,写C++插件的可以用到。 RapidJSON —— C++ 快速 JSON 解析器和生成器
点这里 原文: RapidJSON —— C++ 快速 JSON 解析器和生成器 时间 2015-04-05 07:33:33 开源中国新闻原文 http://www.oschina.net/p/ ...
- 如何编写一个JSON解析器
编写一个JSON解析器实际上就是一个函数,它的输入是一个表示JSON的字符串,输出是结构化的对应到语言本身的数据结构. 和XML相比,JSON本身结构非常简单,并且仅有几种数据类型,以Java为例,对 ...
- 一个简单的json解析器
实现一个简单地json解析器. 两部分组成,词法分析.语法分析 词法分析 package com.mahuan.json; import java.util.LinkedList; import ja ...
- spring boot2 修改默认json解析器Jackson为fastjson
0.前言 fastjson是阿里出的,尽管近年fasjson爆出过几次严重漏洞,但是平心而论,fastjson的性能的确很有优势,尤其是大数据量时的性能优势,所以fastjson依然是我们的首选:sp ...
- 用ExpressionTree实现JSON解析器
今年的春节与往年不同,对每个人来说都是刻骨铭心的.突入其来的新型冠状病毒使大家过上了“梦想”中的生活:吃了睡,睡了吃,还不用去公司上班,如今这样的生活就在我们面前,可一点都不踏实,只有不停的学习才能让 ...
- SpringBoot 默认json解析器详解和字段序列化自定义
前言 在我们开发项目API接口的时候,一些没有数据的字段会默认返回NULL,数字类型也会是NULL,这个时候前端希望字符串能够统一返回空字符,数字默认返回0,那我们就需要自定义json序列化处理 Sp ...
- 自己动手实现一个简单的JSON解析器
1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...
随机推荐
- [更新中]并发和并行(Concurrency and Parallelism)
书籍的简称: CSPPSE: Computer System: a programmer's perspective Second Edition 术语并发是一个通用的概念, 指同时具有多个活动的系统 ...
- 3163: [Heoi2013]Eden的新背包问题
Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...
- asp.net简单小爬虫
所谓爬虫简单点说,就是把别人网站上的东西爬下来,至于爬做什么用就看你自己了,比如:把别人网站上的东西爬下来放在自己网站中(感觉有点像小偷^v^). 这里随便写了一个爬虫代码(可以自己再去进行完善): ...
- 解决VMware下安装Ubuntu15不支持1920X1080分辨率的问题
解决步骤如下: flashmx@ubuntu:~$ cvt # 192.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz Modeline -hsync +vsync ...
- Mysql 复合键索引性能
数据库的常见的索引一般是单个字段,如果多个字段的组合,那么就组成了复合索引.对于组合索引,如果 对其中一字段做为条件查询,会出现什么情况呢? 一.例子 mysql> show create ta ...
- android:shape
android:shape=["rectangle" | "oval" | "line" | "ring"] shape ...
- RHEL5.8使用yum安装xclock
使用xshell连接RHEL5.8服务器,敲入xclock命令想验证图形化安装条件,但是显示无此命令. [root@template ~]# xclock -bash: xclock: command ...
- Rsync 3.1.0 发布,文件同步工具
文件同步工具Rsync 3.1.0发布.2013-09-29 上一个版本还是2011-09-23的3.0.9 过了2年多.Rsync基本是Linux上文件同步的标准了,也可以和inotify配合做实时 ...
- C#设计模式(6)——原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- Installing SCM-Manager
With SCM-Manager, people can share and manage Git, Mercurial and Subversion repositories over http e ...