近年来JSON作为一个流行的数据交换格式逐渐取代了XML在网络通信方面的作用。基于REST原则的面向资源的方式再加上使用JSON串携带数据已经成为了成为了客户端和服务器端传递数据的主流。而在JAVA中便需要一些将POJO转换为标准的JSON的库来减轻开发人员的工作量。下面介绍一下当下流行的几种JSON库。
fastjson
fastjson应该算是当下国内最流行的一个Json库,它是阿里的一位大神采用Java语言编写的。据说有无与伦比的性能,在解析速度上完虐国外其他的JSON库,但是网上的评论并不友好,看来是否真的完虐还值得商榷。本人也没有做过性能测试,这里便不置喙。但是在国内这个库确实相当的流行,在从JSON转化为POJO是确实性能优越,但是在复杂类型的POJO到JSON的转化上会出现以下问题,在功能上较之下面要介绍的Gson还有一些不足。因此国内的有些团队通常将它和Gson结合使用。下面介绍一下它的基础用法。
常用API
下面是fastjson的一些常用的API,通过使用这写API便可以实现JSON与POJO的基本转化。fastjson中的方法一般很多都是静态的,在这一点上我认为是优于Gson和jackJson的地方,在使用上确实方便一些。
序列化
1 | package com.alibaba.fastjson; |
反序列化
1 | package com.alibaba.fastjson; |
代码示例
JSON转POJO
1 | String jsonString = ...; |
POJO转JSON
1 | Group group = new Group(); |
集合泛型的反序列化
1 | Type type = new TypeReference<List<Model>>() {}.getType(); |
POJO转byte
1 | Model model = ...; |
将POJO作为字符串写入OutputStream
1 | Model model = ...; |
将POJO作为字符串写入Write
1 | Model model = ...; |
定制序列化
有时我们在序列化是可能希望排除某些属性,这时就需要定制,fastjson在这方面也有支持。fastjson有多种定制序列化的方式:
- 通过@JSONField定制序列化
- 通过@JSONType定制序列化
- 通过SerializeFilter定制序列化
- 通过ParseProcess定制反序列化
使用@JSONField定制序列化
源码种这个泛型的定义如下:
1 | (RetentionPolicy.RUNTIME) |
我们可以在序列化的类的属性或者方法上使用上述注解来实现定制。如:
1 | public class A { |
或者:
1 | public class A { |
通过@JSONType定制序列化
源码如下:
1 | (RetentionPolicy.RUNTIME) |
这个注解和@JSONField类似,但是是作用在类级别上的。
通过SerializeFilter定制序列化
通过SerializeFilter可以使用扩展编程的方式实现定制序列化。fastjson提供了多种SerializeFilter:
- PropertyPreFilter 根据PropertyName判断是否序列化
- PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化
- NameFilter 修改Key,如果需要修改Key,process返回值则可
- ValueFilter 修改Value
- BeforeFilter 序列化时在最前添加内容
- AfterFilter 序列化时在最后添加内容
代码示例:
1 | public interface PropertyFilter extends SerializeFilter { |
1 | PropertyFilter filter = new PropertyFilter() { |
通过ParseProcess定制反序列化
ParseProcess是编程扩展定制反序列化的接口。fastjson支持如下ParseProcess:
- ExtraProcessor 用于处理多余的字段
- ExtraTypeProvider 用于处理多余字段时提供类型信息
代码示例:
1 | public static class VO { |
JSONPath
fastjson中还有一个功能强大的工具类,主要源码如下:
1 | package com.alibaba.fastjson; |
Gson
Gson是Google的一个JSON开源库,功能强大,转换稳定,能够实现复杂类型的json到bean或bean到json的转换。在功能性和稳定性上它应该是比fastjson要优秀的,但是解析速度可能稍逊。在两者之间的选择可以结合项目需求进行抉择。
jackson
jackson是国外比较流行的一个jackson库(国内的应该是fastjson用的比较多),被后端web开发的很多开源库所依赖,比如spring的webmvc项目。既然被那么多牛逼库所使用,说明它也是一个很优秀的项目,但是在国内使用不多,有兴趣的读者可以翻看一下它的文档。
jsonlib
比较老的一个json库,现在已经很少被使用了,主要是它需要依赖很多第三方的包,且性能也不算好。
总结
这些json库使用起来都不是很难,毕竟源库的流行程度和它的学习曲线也是有关系的,因此很多开源库都讲究容易上手,当然要想达到精通,还是要发点时间学习的。上面这几个开源库读者只要熟悉fastjson和Gson,基本上已经可以满足开发需求了。