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包运行时,只能加载出部分数据,一开始怀疑过运行内存分配过小…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...