Java 如何像 Python 一样 简洁 优雅地 构造 和 解析 Json 数据

作者:咪博士

身为一名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数据

Java 如何像 Python 一样 简洁 优雅地 构造 和 解析 Json 数据_第1张图片
demoMake.png

13行:使用Json.object()开始构造一个JsonObject,要添加属性-值,只需要不断地调用其set方法。重点是set方法返回类型也是Json,所以,你可以像示例代码中那样,直接多次串联调用set方法,代码相当简洁。

16行:怎么把Json对象转换成符合Json格式的字符串呢?没错!就用大家最熟悉的toString方法,就是这么简单。

21行:如果我有一个符合Json格式的字符串,我要如何构造相应的Json对象呢?答案是使用read方法,mjson会帮你搞定一切的。

实例2:解析简单的Json数据

Java 如何像 Python 一样 简洁 优雅地 构造 和 解析 Json 数据_第2张图片
demoParse.png

44行:判断一个JsonObject是否包含某一属性,使用has方法

47行:获取某个属性的值,先使用at方法,得到相应的Json对象,然后再根据具体的数据类型,调用类似asXXX方法。例如,字符串类型就调用asString方法;整型就调用asInteger方法。

实例3:构造复杂(嵌套)的Json数据

Java 如何像 Python 一样 简洁 优雅地 构造 和 解析 Json 数据_第3张图片
demoMakeComplex.png

mjson中构造JsonArray有2种方法:

(1)使用Json.array(),然后,多次串联调用add方法,往Json数据中添加元素 (例如63行代码)

(2)使用Java标准的数据类型,如Map, List等,然后在设置属性值的时候,直接使用Map或List。mjson会非常聪明地把它们转换为JsonArray(例如73行代码)

实例4:解析复杂(嵌套)的Json数据

Java 如何像 Python 一样 简洁 优雅地 构造 和 解析 Json 数据_第4张图片
dempParseComplex.png

mjson中解析JsonArray也有2种方法:

(1)如果每个数组元素,又是一个JsonObject,调用asJsonList方法,得到List列表,然后上一个for循环,你就可以为所欲为了。(参考:95 - 99行代码)

(2)如果每个数组元素,只是一些简单的数据类型,如字符串等,不包含更复杂的结构,那么就先调用asList方法,得到List列表,同样用一个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服务)。

.p��>|$�

你可能感兴趣的:(Java 如何像 Python 一样 简洁 优雅地 构造 和 解析 Json 数据)