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

news2024/9/27 22:19:45

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

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

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

2. 案例演示

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

机构对象:

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

角色对象:

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

用户对象:

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依赖:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.17.0</version>
        </dependency>

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

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

        // 1. 创建 JsonFactory
        JsonFactory 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.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

        // 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); // long
        jsonGenerator.writeStringField("name", "坤坤"); // String
        jsonGenerator.writeNumberField("age", 18); // int

当前JSON内容如下:

{"id":1699632398490275840,"name":"坤坤","age":18 

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

        // 3.3 写对象属性  
        jsonGenerator.writeFieldName("org"); // 属性名称
        jsonGenerator.writeStartObject(); // 开始写入对象=》{
        jsonGenerator.writeNumberField("id", 1699967647585800192L); // long
        jsonGenerator.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); // 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();// 写入集合结束=》 ] 

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

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

2.4 查看文件

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1541456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊跨境电商为什么要多备几个店铺?多店铺运营技巧

在亚马逊&#xff0c;链接断货超过15天的话就会降权&#xff0c;之后想要把权重升回来是要下不少功夫的&#xff0c;如果这时候有一个备用店铺的话&#xff0c;就可以跟卖自己大号的链接&#xff0c;先保持出单&#xff0c;把权重稳住那么多店铺就需要多个信用卡进行扣店铺租金…

小车倒立摆系统极点配置,LQR闭环控制

在之前直流电机控制仿真里有讲过状态控制的基本架构&#xff0c;有兴趣的同学可以再回去看看&#xff0c;链接如下好玩的直流电机调速实验、PID、极点配置、LQR、观测器&#xff1b;不讲大道理_lqr控制器观测器-CSDN博客 在专栏的前三篇文章 小车倒立摆物理建模与simulink仿真…

【Nebula笔记】简介及安装

目录 一、简介 (一) 什么是图数据库 二、安装 (一) 原生安装 (二) Docker & Docker compose 1. Docker安装 Linux Window 2. 部署NebulaGraph (三) to MAC 三、Nebula Graph Studio (一) 版本兼容性 (二) 原生安装 (三) Docker compose (四) 连接Nebula Gra…

Git——IDEA中的使用详解

目录 Git1、IDEA中配置Git2、将本地项目推送到远程仓库2.1、创建项目远程仓库2.2、初始化本地仓库2.3、连接远程仓库2.4、提交到本地仓库2.5、推送到远程仓库 3、克隆远程仓库到本地4、基本操作4.1、代码提交到暂存区4.2、暂存区代码提交到本地库4.3、推送到远程仓库4.4、撤销本…

主干网络篇 | YOLOv8改进之在主干网络中引入密集连接卷积网络DenseNet

前言:Hello大家好,我是小哥谈。DenseNet(密集连接卷积网络)是一种深度学习神经网络架构,它在2017年由Gao Huang等人提出。DenseNet的核心思想是通过密集连接(dense connection)来促进信息的流动和共享。在传统的卷积神经网络中,每个层的输入只来自于前一层的输出。而在…

【CDA二级数据分析备考思维导图】

CDA二级数据分析备考思维导图 CDA二级复习备考资料共计七个章节&#xff0c;如需资料&#xff0c;请留言&#xff0c;概览如下图&#xff1a;一、数据采集与处理1.数据采集方法2.市场调研和数据录入3、数据探索与可视化4、数据预处理方法 总结&#xff1a;以上为自己学习数据分…

MySQL临时表:临时存储数据的灵活利器

MySQL临时表&#xff1a;临时存储数据的灵活利器 MySQL临时表是处理数据时非常有用的工具&#xff0c;它提供了临时存储数据的能力&#xff0c;使得复杂查询、排序、聚合以及数据筛选变得更加高效和简单。在本文中&#xff0c;我们将深入探讨MySQL临时表的概念以及何时需要使用…

VBA即用型代码手册:保护公式单元格和删除所有空白工作表的代码

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

25.6 MySQL 子查询

1. 子查询 子查询(Subquery): 是SQL查询语句中的一个重要概念, 它允许在一个查询语句(主查询)中嵌套另一个查询语句(子查询). 这意味着一个查询可以作为另一个查询的输入或条件, 子查询可以出现在SQL语句的多个位置, 例如SELECT, FROM, WHERE等子句中.子查询通常用于以下几种情…

get_ipython()函数使用

今天发现一个很有意思的函数&#xff0c; 在jupyter notebook中&#xff0c;我也可以用命令实现这些值 get_ipython().system(nvidia-smi)结果如下 get_ipython().system(pwd)

nodeJs中实现连表查询

nodeJs中实现连表查询 router.post(/getOrder, async function(req, res, next) {let userId req.body.phone;let sql select * from orders where userId?;let orders await new Promise((resolve, reject) > {connection.query(sql, [userId], function(error, resul…

《手把手教你》系列技巧篇(四十九)-java+ selenium自动化测试-隐藏元素定位与操作(详解教程)

1.简介 对于前端隐藏元素&#xff0c;一直是selenium自动化定位元素的隐形杀手&#xff0c;脚本跑到隐藏元素时位置时报各种各样的错误&#xff0c;可是这种隐藏的下拉菜单又没有办法避免&#xff0c;所以非常头痛&#xff0c;这一篇只为交流隐藏元素自动化定位处理方法以及宏哥…

HarmonyOS(鸿蒙)应用开发——(一)

目录 1 创建hellopro项目 2 了解ArkTS 3 了解ArkTS的组件 4 组件介绍 4.1 常用基础组件&#xff1a; 4.1.1 Text 4.1.2 Button 4.1.3 TextInput 4.2 容器组件 4.2.1 Column 4.2.2 Row 5 案例——实现一个简易登录页面 5.1 在实现预览效果之前&#xff0c;我们…

几个简单的参数,实现计算特征向量的余弦相似度(java实现,纯手撸)

几个简单的参数&#xff0c;实现计算特征向量的余弦相似度&#xff08;java实现&#xff0c;纯手撸&#xff09; 太狂喽&#xff01;突然高级起来&#x1f9e0;&#x1f9e0;&#x1f9e0;&#x1f9e0;&#x1f9e0;&#x1f9e0;&#x1f9e0;&#x1f9e0;&#x1f9e0;&am…

【大模型】在VS Code(Visual Studio Code)上安装中文汉化版插件

文章目录 一、下载安装二、配置显示语言&#xff08;一&#xff09;调出即将输入命令的搜索模式&#xff08;二&#xff09;在大于号后面输入&#xff1a;Configure Display Language&#xff08;三&#xff09;重启 三、总结 【运行系统】win 11 【本文解决的问题】 1、英文不…

Linux 文件探秘:检查文件大小的四种神器

Linux 文件探秘&#xff1a;检查文件大小的四种神器 Linux 文件探秘&#xff1a;检查文件大小的四种神器摘要引言正文内容&#x1f6e0;️ 方法一&#xff1a;使用ls命令详细步骤示例 &#x1f6e0;️ 方法二&#xff1a;使用du命令详细步骤示例 &#x1f6e0;️ 方法三&#…

C语言笔记:指针与数组

ACM金牌带你零基础直达C语言精通-课程资料 本笔记属于船说系列课程之一&#xff0c;课程链接&#xff1a;ACM金牌带你零基础直达C语言精通https://www.bilibili.com/cheese/play/ep159068?csourceprivate_space_class_null&spm_id_from333.999.0.0 你也可以选择购买『船说…

通过dbeaver链接dm8数据库

一、环境说明 windows 11 vmware 17 ubuntu 22 tt:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammytt:~$ docker info Client:Version: 24.0.5Context: d…

【进程概念】环境变量PATH(结合代码,超极容易理解)

文章目录 什么叫环境变量常见环境变量查看环境变量测试PATH修改PATH HOME和环境变量相关的命令环境变量是如何被组织的解释main函数里的参数如何在程序中获得环境变量1.命令行第三个参数2.通过第三方变量environ获取 通过系统调用putenv和getenv获取或设置环境变量环境变量通常…

带3090显卡的Linux服务器上部署SDWebui

背景 一直在研究文生图&#xff0c;之前一直是用原始模型和diffuser跑SD模型&#xff0c;近来看到不少比较博主在用 SDWebui&#xff0c;于是想着在Linux服务器上部署体验一下&#xff0c;谁知道并没有想象的那么顺利&#xff0c;还是踩了不少坑。记录一下过程&#xff0c;也许…