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包运行时,只能加载出部分数据,一开始怀疑过运行内存分配过小…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
