有道无术,术尚可求,有术无道,止于术。
本系列Jackson 版本 2.17.0
源码地址:https://gitee.com/pearl-organization/study-seata-demo
文章目录
- 1. 前言
- 2. 案例演示
- 2.1 创建 JsonFactory
- 2.2 创建 JsonGenerator
- 2.3 写入操作
- 2.4 查看文件
1. 前言
在上一篇我们了解过Jackson
包含三大核心模块:
jackson-core
:核心底层模块,定义了一些底层的流处理API
和公共抽象类jackson-annotations
:标准注解模块,定义了标准的用于数据处理的相关注解jackson-databind
:数据绑定模块,依赖于上面两个模块,定义了用于数据绑定的高层API
其中jackson-core是核心中的核心,其他模块都需要引入,提供了底层的Streaming API
和公共类,该模块中有三个非常重要的类:
JsonGenerator
:JSON
生成器,用于写入数据JsonParser
:JSON
解析器,用于读取数据JsonFactory
:JSON
工厂类,用于创建JsonGenerator
、JsonParser
2. 案例演示
当前存在一个用户的POJO
类,包含了用户基本信息、机构信息、角色信息。
机构对象:
public class Org { // 机构ID private Long id; // 机构名称 private String orgName; // 机构地址 private String address; // 省略 getter\setter.......... }
复制
角色对象:
public class Role { // 角色ID private Long id; // 角色名称 private String roleName; // 角色编码 private String roleCode; // 省略 getter\setter.......... }
复制
用户对象:
public class User { // 用户ID private Long id; // 姓名 private String name; // 年龄 private Integer age; // 所属机构 private Org org; // 角色列表 private List<Role> roleList; // 省略 getter\setter.......... }
复制
要求使用jackson-core
中的API
将某个用户对象实例转为如下所示的JSON
:
2.1 创建 JsonFactory
首先需要引入jackson-core
依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.17.0</version> </dependency>
复制
JsonFactory
是Jackson
最重要的一个工厂类,用于配置和构建JsonGenerator
、JsonParser
,其实例是线程安全的,配置后可重复使用, 一般在应用中只使用一个全局共享的工厂实例即可。
JsonFactory
可以使用以下两种方式构建:
// 1. 创建 JsonFactory JsonFactory jsonFactoryByBuilder =JsonFactory.builder().build(); // 方式一:Builder 构建 JsonFactory jsonFactory = new JsonFactory(); // 方式二:直接 new
复制
2.2 创建 JsonGenerator
JsonGenerator
是用于生成JSON
内容的API
的基类,它有很多实现子类:
JsonGenerator
实例必须调用JsonFactory
进行创建,JsonFactory
提供了多种创建方法:
// 写入到java.io.DataInput,并指定编码方式 public abstract JsonGenerator createGenerator(DataOutput out, JsonEncoding enc) throws IOException; // 写入到java.io.DataInput public abstract JsonGenerator createGenerator(DataOutput out) throws IOException; // 写入到文件,并指定编码方式 public abstract JsonGenerator createGenerator(File f, JsonEncoding enc) throws IOException; // 写入到java.io.OutputStream public abstract JsonGenerator createGenerator(OutputStream out) throws IOException; // 写入到java.io.OutputStream,并指定编码方式 public abstract JsonGenerator createGenerator(OutputStream out, JsonEncoding enc) throws IOException; // 写入到java.io.Writer public abstract JsonGenerator createGenerator(Writer w) throws IOException;
复制
这里我们直接写入到文件中,并指定编码方式为UTF-8
:
// 2. 创建生成器 File file = new File("E:\\TD\\pearl\\study-jackson-demo\\jackson-core-demo\\src\\main\\java\\com\\pearl\\jacksoncore\\demo\\file\\user.json"); JsonGenerator jsonGenerator = jsonFactory.createGenerator(file, JsonEncoding.UTF8);
复制
上面创建的JsonGenerator
实例类型是UTF8JsonGenerator
:
2.3 写入操作
接下来我们就可以使用JsonGenerator
对象进行写操作了,JSON
字符串最外层都是一个大括号{ }
,所以需要先写一个{
:
// 3. 写操作 // 3.1 开始写对象=》{ jsonGenerator.writeStartObject();
复制
当前JSON
内容如下:
{
复制
接着写基本数据类型的属性和值:
// 3.2 写属性、属性值 jsonGenerator.writeNumberField("id", 1699632398490275840L); // long jsonGenerator.writeStringField("name", "坤坤"); // String jsonGenerator.writeNumberField("age", 18); // int
复制
当前JSON
内容如下:
{"id":1699632398490275840,"name":"坤坤","age":18
复制
接着写对象类型的属性和值,首先写入属性值org
,然后写入机构对象的属性、值:
// 3.3 写对象属性 jsonGenerator.writeFieldName("org"); // 属性名称 jsonGenerator.writeStartObject(); // 开始写入对象=》{ jsonGenerator.writeNumberField("id", 1699967647585800192L); // long jsonGenerator.writeStringField("orgName", "阿里巴巴"); jsonGenerator.writeStringField("address", "浙江杭州"); jsonGenerator.writeEndObject(); // 结束写入对象=》}
复制
当前JSON
内容如下:
{"id":1699632398490275840,"name":"坤坤","age":18,"org":{"id":1699967647585800192,"orgName":"阿里巴巴","address":"浙江杭州"}
复制
接着写对象集合:
// 3.3 写对象集合 jsonGenerator.writeFieldName("roleList"); // 属性名称 jsonGenerator.writeStartArray(); // 写入集合开始=》 [ // 第一个角色对象 jsonGenerator.writeStartObject(); // 开始写入对象=》{ jsonGenerator.writeNumberField("id", 1699972559514243072L); // long jsonGenerator.writeStringField("roleName", "系统管理员"); jsonGenerator.writeStringField("roleCode", "ROLE_ADMIN"); jsonGenerator.writeEndObject(); // 结束写入对象=》} // 第二个角色对象 jsonGenerator.writeStartObject(); // 开始写入对象=》{ jsonGenerator.writeNumberField("id", 1701893746586685440L); // long jsonGenerator.writeStringField("roleName", "企业员工"); jsonGenerator.writeStringField("roleCode", "ROLE_STAFF"); jsonGenerator.writeEndObject(); // 结束写入对象=》} jsonGenerator.writeEndArray();// 写入集合结束=》 ]
复制
最后写一个结束符号}
并关闭流:
// 4. 结束并关流 jsonGenerator.writeEndObject(); // 结束写入对象=》} jsonGenerator.close();
复制
2.4 查看文件
查看生成的文件,可以看到成功写入JSON
: