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和公共类,该模块中有三个非常重要的类:

  • JsonGenerator:JSON生成器,用于写入数据
  • JsonParser:JSON解析器,用于读取数据
  • JsonFactory:JSON工厂类,用于创建JsonGenerator、JsonParser

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>

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

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:

相关推荐
Flynn Liang2 小时前
上线后怎么排查 AI 调用?Spring AI Observability:token/延迟/成本埋点与全链路追踪
java·人工智能·spring·监控·可观测性·observability·springai
VimorphTech3 小时前
每批开 4 个线程,为什么限制不住 TTS 的总并发?
java·spring boot·spring
软件技术NINI5 小时前
基于SpringBoot和Vue的项目评审系统
javascript·vue.js·spring boot·后端·spring·毕业设计·毕设
代码不停5 小时前
Spring Aop
java·数据库·spring
翊众建站17 小时前
用 JSON-LD 给企业官网做结构化数据:LocalBusiness 与 FAQPage 实践笔记
人工智能·搜索引擎·json
Flynn Liang19 小时前
AI 应用的安全红线:Spring AI 下的 Prompt 注入防护、PII 脱敏、输出审计与密钥管理
人工智能·安全·spring·数据泄露·springai·prompt注入
QCoding19 小时前
企业级Agent Evaluation实战:Agent能跑就能上线?AI Agent到底怎么测?
后端·spring
Patrick_Wilson1 天前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言
Flynn Liang1 天前
Spring AI 上生产:限流熔断、密钥与成本治理、私有化/混合部署、降级与 Prompt 灰度架构全解
人工智能·spring·架构·高可用·springai·成本治理·生产架构
Flynn Liang1 天前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai