日常开发中常需要 Json
、 Java
、 Xml
之间的互相转换,相关 数据处理工具(data-processing tools) 有很多,鉴于 Jackson
更加全面且操作简单,这里就介绍一下 Jaxckson 的简单用法。
注意 :
jackson-dataformat-xml
是 Jackson 扩展组件,只提供了一些简单的方式操作 xml ,不适合作为操作 xml 的主力工具使用。
下面是一些主流的转换工具:
转换工具 | 说明 |
---|---|
json-lib |
老牌的转换工具,功能全面, 但第三方依赖多,效率低等,基本停止更新,不推荐使用 。 |
jackson |
当前流行的工具,全面且操作简单。 |
fastjson |
alibaba 的产品,以快而闻名,操作简单,但 不支持 xml 。 |
JSON
Jackson 支持 对 JSON 的读写操作,以下是需要的 maven 依赖:
1 | <!-- https://github.com/FasterXML/jackson-databind --> |
Jackson
提供了三种方式处理 JSON
三种方式并不是相互孤立的,可以相互配合使用。
处理方式 | 说明 | 适用场景 |
---|---|---|
数据绑定 |
需要有对应的 Java类 来 支持 JSON 和 POJO 的互转,包括 JDK对象 和 自定义对象。 |
适用于数据绑定映射 |
树模型 |
以树模型来操作 JSON ,针对树节点操作,更加灵活。 |
适用于复杂的数据结构 |
流式API |
最佳效率来处理 JSON ,和 树模型 一样良好,操作相对复杂。 |
适用于追求效率的工作 |
数据绑定
数据绑定
处理方式极其简单,只需要的提供与 Json 相互对应的 Java类
就可以快速完成 java
与 Json
的相互转换。 但局限也是在此,需要场景明确数据结构。
POJO.java
1 | public class User { |
数据绑定
需要 ObjectMapper
对象,该对象可以重用。该方式同样适用于 Map
和 List
。
1 |
|
树模型
树模型
引入了 JsonNode
对象,允许使用操作树节点的方式对 json
进行读写,并且利于遍历。
1 |
|
当然此时如果不想使用 JsonNode
对象,可以使用如下方式转换为对应的 Java对象
。
1 | // JsonNode to POJO |
流式API
流式API
引入了 JsonParser
和 JsonGenerator
两个对象,JsonGenerator
负责写操作, JsonParser
负责读操作。
1 | /** |
1 | /** |
由以上的代码,可以看出单纯的 流操作 比较繁杂,操作起来有些得不偿失。
正如之前所说,这三种方式并不是相互孤立的,可以相互配合使用。
1 | /** |
JSON 与 XML
Jackson 支持 对 XML 的简单读写操作,以下是需要的 maven 依赖:
1 | <!-- https://github.com/FasterXML/jackson-dataformat-xml --> |
对 XML 的操作类似于 JSON,这里仅展示 JSON 与 XML 的互转。
1 |
|
Jackson配置: Feature
Jackson 预定义了一些配置,可以通过 configure方法
启用和禁用相关特性( Feature
),在 Jackson2.5 又进行了细化,新添加了 enable方法
和 disable方法
,两种方式都可以使用,但推荐后者。
1 | // 启用与禁用:缩进特性 |
常用的配置
这里列举了一些常用的配置,基本可以满足日常开发。
Jackson 的 Json解析 默认是严格按照
JSON标准
的,而 JavaScript 中的 json 并不严格按照这个标准的。
1 | // 支持单引号(兼容 js ) |
Jackson特性( JacksonFeatures )主要包含以下两种,并含有默认值。
- 数据绑定特性 :
MapperFeature
,SerializationFeature
,DeserializationFeature
。 - 流式API特性:
JsonFactory.Feature
,JsonParser.Feature
,JsonGenerator.Feature
。
类型格式化
Jackson 对于不同的数据类型,实现不同的格式化,这里以 日期类型 为例说明。
默认行为
默认序列化
日期类型默认序列化为时间戳(数值型),即 Java 中的日期类型
会默认转换为 JSON中的数值类型
: 距离 1970-01-01 08:00:00
的毫秒差。
默认反序列化
对于日期类型,Jackson 有默认的反序列化格式 StdDateFormat
,即 以下格式字符串 可以转换为 Java 中的日期类型。
JSON数值型
也可以被转换为java日期类型
。
1 | DATE_FORMAT_STR_ISO8601, // "yyyy-MM-dd'T'HH:mm:ss.SSSZ" |
自定义格式化: Module
Jackson 提供了功能扩展接口 Module(模块)
, 一般使用 SimpleModule
就可以了, 向其添加 序列化器
和 反序列化器
,再 注册模块
。
这种方式会覆盖
StdDateFormat
,但是数值型还是可以被正常解析的。
1 | // 定义扩展模块 |
实际上,对于日期类型可以直接使用以下方式简单实现:
两种方式可以并存,
module
的优先级更高,推荐使用module
统一管理扩展。
1 | // 自定义 序列化格式 与 反序列化格式 |