Jackson 2.x 系列【2】生成器 JsonGenerator

有道无术,术尚可求,有术无道,止于术。

本系列Jackson 版本 2.17.0

源码地址:https://gitee.com/pearl-organization/study-seata-demo

文章目录

    • [1. 前言](#1. 前言)
    • [2. 案例演示](#2. 案例演示)
      • [2.1 创建 JsonFactory](#2.1 创建 JsonFactory)
      • [2.2 创建 JsonGenerator](#2.2 创建 JsonGenerator)
      • [2.3 写入操作](#2.3 写入操作)
      • [2.4 查看文件](#2.4 查看文件)

1. 前言

在上一篇我们了解过Jackson包含三大核心模块:

  • jackson-core:核心底层模块,定义了一些底层的流处理API和公共抽象类
  • jackson-annotations:标准注解模块,定义了标准的用于数据处理的相关注解
  • jackson-databind:数据绑定模块,依赖于上面两个模块,定义了用于数据绑定的高层API

其中jackson-core是核心中的核心,其他模块都需要引入,提供了底层的Streaming API和公共类,该模块中有三个非常重要的类:

  • JsonGeneratorJSON生成器,用于写入数据
  • JsonParserJSON解析器,用于读取数据
  • JsonFactoryJSON工厂类,用于创建JsonGeneratorJsonParser

2. 案例演示

当前存在一个用户POJO类,包含了用户基本信息、机构信息、角色信息。

机构对象:

java 复制代码
public class Org {
    // 机构ID
    private Long id;
    // 机构名称
    private String orgName;
    // 机构地址
    private String address;
    // 省略 getter\setter..........
}

角色对象:

java 复制代码
public class Role {
    // 角色ID
    private Long id;
    // 角色名称
    private String roleName;
    // 角色编码
    private String roleCode;
    // 省略 getter\setter..........
}

用户对象:

java 复制代码
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依赖:

xml 复制代码
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.17.0</version>
        </dependency>

JsonFactoryJackson最重要的一个工厂类,用于配置和构建JsonGeneratorJsonParser,其实例是线程安全的,配置后可重复使用, 一般在应用中只使用一个全局共享的工厂实例即可。

JsonFactory可以使用以下两种方式构建:

java 复制代码
        // 1. 创建 JsonFactory
        JsonFactory jsonFactoryByBuilder =JsonFactory.builder().build(); // 方式一:Builder 构建
        JsonFactory jsonFactory = new JsonFactory(); // 方式二:直接 new

2.2 创建 JsonGenerator

JsonGenerator是用于生成JSON内容的API的基类,它有很多实现子类:

JsonGenerator实例必须调用JsonFactory进行创建,JsonFactory提供了多种创建方法:

java 复制代码
    // 写入到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

java 复制代码
        // 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字符串最外层都是一个大括号{ },所以需要先写一个{

java 复制代码
        // 3. 写操作
        // 3.1 开始写对象=》{
        jsonGenerator.writeStartObject();

当前JSON内容如下:

json 复制代码
{ 

接着写基本数据类型的属性和值:

java 复制代码
        // 3.2 写属性、属性值
        jsonGenerator.writeNumberField("id", 1699632398490275840L); // long
        jsonGenerator.writeStringField("name", "坤坤"); // String
        jsonGenerator.writeNumberField("age", 18); // int

当前JSON内容如下:

json 复制代码
{"id":1699632398490275840,"name":"坤坤","age":18 

接着写对象类型的属性和值,首先写入属性值org,然后写入机构对象的属性、值:

java 复制代码
        // 3.3 写对象属性  
        jsonGenerator.writeFieldName("org"); // 属性名称
        jsonGenerator.writeStartObject(); // 开始写入对象=》{
        jsonGenerator.writeNumberField("id", 1699967647585800192L); // long
        jsonGenerator.writeStringField("orgName", "阿里巴巴");
        jsonGenerator.writeStringField("address", "浙江杭州");
        jsonGenerator.writeEndObject(); // 结束写入对象=》}

当前JSON内容如下:

json 复制代码
{"id":1699632398490275840,"name":"坤坤","age":18,"org":{"id":1699967647585800192,"orgName":"阿里巴巴","address":"浙江杭州"}

接着写对象集合:

java 复制代码
        // 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();// 写入集合结束=》 ] 

最后写一个结束符号}并关闭流:

java 复制代码
       // 4. 结束并关流
        jsonGenerator.writeEndObject(); // 结束写入对象=》}
        jsonGenerator.close();

2.4 查看文件

查看生成的文件,可以看到成功写入JSON

相关推荐
qq_三哥啊2 小时前
【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
spring·intellij-idea·mybatis
别惹CC3 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
寒士obj3 小时前
Spring事物
java·spring
IT毕设实战小研11 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
甄超锋13 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
Java小白程序员16 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
甄超锋17 小时前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven
还是鼠鼠18 小时前
tlias智能学习辅助系统--Maven 高级-私服介绍与资源上传下载
java·spring boot·后端·spring·maven
还是大剑师兰特19 小时前
Spring面试题及详细答案 125道(1-15) -- 核心概念与基础1
spring·大剑师·spring面试题·spring教程
python_13621 小时前
web请求和响应
java·spring·github