Jackson 2.x 系列【2】生成器 JsonGenerator
有道无术,术尚可求,有术无道,止于术。
本系列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 {// 机构IDprivate Long id;// 机构名称private String orgName;// 机构地址private String address;// 省略 getter\setter..........
}
角色对象:
public class Role {// 角色IDprivate Long id;// 角色名称private String roleName;// 角色编码private String roleCode;// 省略 getter\setter..........
}
用户对象:
public class User {// 用户IDprivate 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. 创建 JsonFactoryJsonFactory 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.DataInputpublic abstract JsonGenerator createGenerator(DataOutput out) throws IOException;// 写入到文件,并指定编码方式public abstract JsonGenerator createGenerator(File f, JsonEncoding enc) throws IOException;// 写入到java.io.OutputStreampublic abstract JsonGenerator createGenerator(OutputStream out) throws IOException;// 写入到java.io.OutputStream,并指定编码方式public abstract JsonGenerator createGenerator(OutputStream out, JsonEncoding enc) throws IOException;// 写入到java.io.Writerpublic 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); // longjsonGenerator.writeStringField("name", "坤坤"); // StringjsonGenerator.writeNumberField("age", 18); // int
当前JSON内容如下:
{"id":1699632398490275840,"name":"坤坤","age":18
接着写对象类型的属性和值,首先写入属性值org,然后写入机构对象的属性、值:
// 3.3 写对象属性 jsonGenerator.writeFieldName("org"); // 属性名称jsonGenerator.writeStartObject(); // 开始写入对象=》{jsonGenerator.writeNumberField("id", 1699967647585800192L); // longjsonGenerator.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); // longjsonGenerator.writeStringField("roleName", "系统管理员");jsonGenerator.writeStringField("roleCode", "ROLE_ADMIN");jsonGenerator.writeEndObject(); // 结束写入对象=》}// 第二个角色对象jsonGenerator.writeStartObject(); // 开始写入对象=》{jsonGenerator.writeNumberField("id", 1701893746586685440L); // longjsonGenerator.writeStringField("roleName", "企业员工");jsonGenerator.writeStringField("roleCode", "ROLE_STAFF");jsonGenerator.writeEndObject(); // 结束写入对象=》}jsonGenerator.writeEndArray();// 写入集合结束=》 ]
最后写一个结束符号}并关闭流:
// 4. 结束并关流jsonGenerator.writeEndObject(); // 结束写入对象=》}jsonGenerator.close();
2.4 查看文件
查看生成的文件,可以看到成功写入JSON:

相关文章:
Jackson 2.x 系列【2】生成器 JsonGenerator
有道无术,术尚可求,有术无道,止于术。 本系列Jackson 版本 2.17.0 源码地址:https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 案例演示2.1 创建 JsonFactory2.2 创建 JsonGenerator2.3 写入操作2.4 查…...
说说webpack中常见的Loader?解决了什么问题?
文章目录 一、是什么配置方式 二、特性三、常见的loadercss-loaderstyle-loaderless-loaderraw-loaderfile-loaderurl-loader 参考文献 一、是什么 loader 用于对模块的"源代码"进行转换,在 import 或"加载"模块时预处理文件 webpack做的事情…...
Django 铺垫
【一】基础知识点 【1】web框架的本质 Web框架本质上可以看成是一个功能强大的socket服务端用户的浏览器可以看成是拥有可视化界面的socket客服端两种通过网络请求实现数据交互 【2】浏览器发送请求 (1)HTTP协议 HTTP协议是超文本传输协议ÿ…...
浅谈C++的继承与多态(静态绑定、动态绑定和虚函数等)
今天我们来谈谈C的继承与多态😊😊😊,本篇的关键内容如下: 继承的本质及其原理派生类的构造和析构过程重载、隐藏和覆盖类的向下或向上转型静态绑定与动态绑定虚函数对类的影响虚析构函数 下面,我们将对这…...
【无人机综合考试题】
1.请选择出哪一个功能选项,在手动遥控飞行时,可以改变各通道的操作灵敏度? 行程比例在手动遥控飞行时,可以改变各通道的操作灵敏度 用于起降的遥控器中 THR、ELE 通道分别控制多旋翼无人机的什么运动? AIL(左、右移动)RUD(左、右水平旋转…...
JS精度计算的几种解决方法,1、转换成整数计算后再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js
提示:学习express,搭建管理系统 文章目录 前言一、转换成整数计算后再转换成小数二、toFixed三、math.js四、bignumber.js五、big.js总结 前言 原始计算 let aNum 6.6 0.3;let bNum 6.6 - 0.2;let cNum 6.6 * 0.3;let dNum 6.6 / 0.2;console.log(…...
v77.递归
理解: 函数直接或者间接地调用自身;并且有边界条件。 1: #include <stdio.h> int main() {int result fun(3);printf("%d",result);return 0 ; } int fun(int num) {if(num 1)return num;return num fun(num-1); }思路…...
Spring Cloud微服务功能及其组件详细讲解
Spring Cloud微服务功能及其组件详细讲解 文章目录 Spring Cloud微服务功能及其组件详细讲解前言:什么是微服务?一、Spring Cloud原理简述二、核心组件1、服务发现——Nacos/Eureka/Consul1)Nacos服务发现2)Eureka服务发现3&#…...
(三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
这里写目录标题 一、colmap解算数据放入高斯1. 将稀疏重建的文件放入高斯2. 将稠密重建的文件放入高斯 二、vkitti数据放入高斯 一、colmap解算数据放入高斯 运行Colmap.bat文件之后,进行稀疏重建和稠密重建之后可以得到如下文件结构。 1. 将稀疏重建的文件放入高…...
4635: 【搜索】【广度优先】回家
题目描述 小 H 在一个划分成了nm 个方格的长方形封锁线上。 每次他能向上下左右四个方向移动一格(当然小 H 不可以静止不动), 但不能离开封锁线,否则就被打死了。 刚开始时他有满血 6 点,每移动一格他要消耗 1 点血量…...
Uibot6.0 (RPA财务机器人师资培训第1天 )RPA+AI、RPA基础语法
训练网站:泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981(本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~) 紧接着小北之前的几篇博客,友友们我们即将开展新课的学习~…...
【吊打面试官系列】Redis篇 -Redis集群的主从复制模型是怎样的?
大家好,我是锋哥。今天分享关于 【Redis集群的主从复制模型是怎样的?】 面试题,希望对大家有帮助; Redis集群的主从复制模型是怎样的? 为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所…...
高效的二进制列化格式 MessagePack 详解
目录 MessagePack 序列化原理 MessagePack 数据类型及编码方式 MessagePack 序列化与反序列化过程 MessagePack 的优势 应用场景 注意事项 小结 MessagePack (简称 msgPack)是一种高效的二进制序列化格式,可以将各种数据类型ÿ…...
鸿蒙Harmony应用开发—ArkTS-if/else:条件渲染
ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。 说明: 从API version 9开始,该接口支持在ArkTS卡片中使用。 使用规则 支持if、else和else if语句。 if、else if后跟随的条件语句…...
JAVA 100道题(14)
14.使用LinkedList实现一个简单的堆栈(Stack)数据结构。 下面是一个简单的Java程序,使用LinkedList来实现一个堆栈(Stack)数据结构。在这个程序中,我们定义了一个MyStack类,它包含了一些基本的堆…...
STM32+ESP8266水墨屏天气时钟:简易多级菜单(数组查表法)
项目背景 本次的水墨屏幕项目需要做一个多级菜单的显示,所以写出来一起学习,本篇文章不单单适合于水墨屏,像0.96OLED屏幕也适用,区别就是修改显示函数。 设计思路 多级菜单的实现,一般有两种实现的方法 1.通过双向…...
数学建模综合评价模型与决策方法
评价方法主要分为两类,其主要区别在确定权重的方法上 一类是主观赋权法,多次采取综合资讯评分确定权重,如综合指数法,模糊综合评判法,层次评判法,功效系数法等 另一类是客观赋权法,根据各指标…...
window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)
window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm) 一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、全局安装npm、cnpm八、遇到的问题 nvm 全名 node.js version management,顾名思义…...
Mysql——基础命令集合
目录 前期准备 先登录数据库 一、管理数据库 1.数据表结构解析 2.常用数据类型 3.适用所有类型的修饰符 4.使用数值型的修饰符 二、SQL语句 1.SQL语言分类 三、Mysql——Create,Show,Describe,Drop 1.创建数据库 2.查看数据库 3.切换数据库 4.创建数据表 5.查看…...
记录一次流相关故障
记录一次流相关故障 1、项目中有个JSON字典文件,通过流的方式加载进来,写了个输入流转字符串的方法,idea开发环境下运行一切正常,打成jar或者war包运行时,只能加载出部分数据,一开始怀疑过运行内存分配过小…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
