身为一名 Java 程序员,如果要处理 Json 数据,你大抵听说过下面一些类库: Jackson , google gson , json-lib , flexjson , json-io , genson , fastjson 。不过,咪博士在这里不打算和大家探讨这些类库的性能问题(网络上已经有许多关于这些 Json 类库的性能比较,请自行 Google)。咪博士想和大家说的是,在用 Java 进行 Json 数据的构造和解析时,如果写出像动态语言(如Python)一样,简洁、优雅的代码。
答案是:使用 mjson 类库!
你可以在MVN Repository中找到它
http://mvnrepository.com/artifact/org.sharegov/mjson
不说废话,直接上代码,然后听咪博士同大家细细分享。
首先,请牢记,mjson 中最重要的类就是 Json,几乎所有的操作和数据都围绕着 Json 类展开。
实例1:构造简单的Json数据
13 行:使用 Json.object() 开始构造一个JsonObject,要添加属性-值,只需要不断地调用其 set 方法。重点是 set 方法返回类型也是 Json,所以,你可以像示例代码中那样,直接多次串联调用 set 方法,代码相当简洁。
16 行:怎么把 Json 对象转换成符合Json格式的字符串呢?没错!就用大家最熟悉的toString 方法,就是这么简单。
21 行: 如果我有一个符合 Json 格式的字符串,我要如何构造相应的Json 对象呢?答案是使用 read 方法,mjson 会帮你搞定一切的。
实例2:解析简单的Json数据
44 行: 判断一个 JsonObject 是否包含某一属性,使用 has 方法
47 行:获取某个属性的值,先使用at 方法,得到相应的Json对象,然后再根据具体的数据类型,调用类似 asXXX 方法。例如,字符串类型就调用 asString 方法;整型就调用 asInteger 方法。
实例3:构造复杂(嵌套)的Json数据
mjson中构造 JsonArray 有2种方法:
(1) 使用 Json.array(),然后,多次串联调用 add 方法,往Json 数据中添加元素 (例如 63 行代码)
(2) 使用 Java 标准的数据类型,如 Map, List 等,然后在设置属性值的时候,直接使用 Map 或 List。mjson 会非常聪明地把它们转换为 JsonArray(例如 73 行代码)
实例4: 解析复杂(嵌套)的Json数据
mjson 中解析 JsonArray 也有2种方法:
(1) 如果每个数组元素,又是一个 JsonObject,调用 asJsonList 方法,得到 List<Json> 列表,然后上一个 for 循环,你就可以为所欲为了。(参考:95 - 99 行代码)
(2) 如果每个数组元素,只是一些简单的数据类型,如字符串等,不包含更复杂的结构,那么就先调用 asList 方法,得到 List<Object> 列表,同样用一个 for 循环,依次遍历处理这些列表元素即可。当然,请不要忘了将列表元素拆箱成你需要数据类型。(参考:104 - 107 行代码)
咪博士小结:
1. 如 mjson 作者所言,当初其在项目中使用 json 在前端和后台程序间传递数据,前端对 json 数据的处理,十分简洁,而后端使用 Java 处理 Json,总是无比繁琐。他寻遍整个互联网,竟然找不到一个简洁易用的 Json 处理类库,于是就模仿动态语言,编写了 mjson。
2. mjson 的主要优势在于代码简洁,速度方面并没做严格的测试,但对于绝大多数项目,json 的处理应该不会成为多大的性能瓶颈,有兴趣的朋友可以做下性能测试。
3. mjson 尤其擅长处理格式不固定的 Json 数据。Java 中其他的 Json 类库,基本都是在 bean 和 json 之间来回倒腾,其基本假设是你的 Json 数据格式是固定不变的。而在一些应用场景中,例如 Restful 服务中,Json 格式往往是不断变化的,这个时候,就到了 mjson 大显身手的时候了(事实上,mjson的作者当时做的项目就是 Restful 服务)。
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群346942462,我们一起学Java!