Jackson知识点记录

文章目录

  • 一.Jackson
      • 模块说明
  • 二.ObjectMapper
      • 基本功能
      • 使用`ObjectMapper`的一些核心方法:
      • 示例代码
        • 1. 序列化示例
        • 2. 反序列化示例
        • 3. `JsonNode` 处理示例
      • 高级配置
  • 三.各种Node
      • 1. `ObjectNode`
      • 2. `ArrayNode`
      • 3. `ValueNode`
      • 4. `MissingNode`
      • 示例

一.Jackson

Jackson 库主要分为三个核心模块:jackson-corejackson-annotations,和 jackson-databind

模块说明

  1. jackson-core:

    • 提供了Jackson的核心功能,包括基础的读写API(JsonParserJsonGenerator),以及JSON处理的低级实现。
  2. jackson-annotations:

    • 包含了用于配置Jackson数据绑定行为的注解。这些注解通常用于指定如何将Java对象序列化为JSON,或者如何从JSON反序列化为Java对象。
  3. jackson-databind:

    • 提供了高级数据绑定支持,依赖于jackson-core提供的API和jackson-annotations定义的配置注解。它允许直接将JSON转换成Java对象(反序列化)或将Java对象转换成JSON(序列化)。
      在这里插入图片描述

二.ObjectMapper

基本功能

  1. 序列化: 将Java对象转换为JSON字符串。
  2. 反序列化: 将JSON字符串转换为Java对象。
  3. 数据绑定: 支持从各种数据源生成和消耗JSON,包括从文件、URL或字符串。
  4. 流式API: 提供了一种流式生成JSON和解析JSON的方法。

使用ObjectMapper的一些核心方法:

  • writeValue(AsXxx): 用于将对象序列化为JSON,可输出至文件、输出流或者字符串。
  • readValue: 用于将JSON字符串、文件或输入流解析为Java对象。
  • convertValue: 用于转换不同的数据类型,例如从一种Java对象转换为另一种。
  • readTree: 读取JSON内容至一个JsonNode树模型,这在灵活处理JSON数据时非常有用。

示例代码

1. 序列化示例
ObjectMapper objectMapper = new ObjectMapper();

Person person = new Person("John Doe", 28);
try {
    String json = objectMapper.writeValueAsString(person);
    System.out.println(json);
} catch (IOException e) {
    e.printStackTrace();
}
2. 反序列化示例
String json = "{\"name\":\"John Doe\",\"age\":28}";

try {
    Person person = objectMapper.readValue(json, Person.class);
    System.out.println(person.getName());
} catch (IOException e) {
    e.printStackTrace();
}
3. JsonNode 处理示例
String jsonData = "{\"name\":\"Jane Doe\",\"age\":25}";

try {
    JsonNode node = objectMapper.readTree(jsonData);
    String name = node.get("name").asText();
    int age = node.get("age").asInt();
    System.out.println("Name: " + name + ", Age: " + age);
} catch (IOException e) {
    e.printStackTrace();
}

高级配置

ObjectMapper 提供了丰富的配置选项来调整其行为,例如:

  • 配置序列化和反序列化的行为:可以通过启用或禁用SerializationFeatureDeserializationFeature枚举中的特性来配置ObjectMapper的行为。例如,你可以禁用在序列化中将日期作为timestamps。
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
  • 自定义属性名:使用注解@JsonProperty来定义JSON属性名。
public class Person {
    private String name;

    @JsonProperty("person_age")
    private int age;

    // Constructors, getters and setters...
}
  • 包含和排除属性:使用@JsonIgnore注解来忽略某些属性,或者配置ObjectMapper只包含非空属性。
objectMapper.setSerializationInclusion(Include.NON_NULL);
  • 自定义序列化器和反序列化器:为特定类型创建自定义序列化器或反序列化器。
objectMapper.registerModule(new SimpleModule().addSerializer(new MyCustomSerializer()));

三.各种Node

在Jackson库中,JsonNode是一个重要的类,用于表示JSON数据的结构化形式。它是一个抽象的、不可变的数据类型,代表JSON数据的节点。以下是Jackson中主要的JsonNode类型,这些类型映射了JSON数据结构的不同组成部分:

1. ObjectNode

  • 表示JSON对象,即键值对的集合。
  • 可以通过键(字符串)访问值(JsonNode)。

2. ArrayNode

  • 表示JSON数组。
  • 提供对数组元素的索引访问,每个元素都是一个JsonNode

3. ValueNode

  • 是一个抽象类,表示JSON的值节点(非数组和非对象)。
  • ValueNode的子类包括:
    • TextualNode:表示JSON字符串。
    • NumericNode:表示JSON数字,具体实现包括IntNode, LongNode, DoubleNode等。
    • BooleanNode:表示JSON布尔值(truefalse)。
    • BinaryNode:表示二进制数据。
    • NullNode:表示JSON的null值。
    • POJONode:表示任何Java对象作为一个节点,通常不是标准JSON类型的一部分,但Jackson允许你将任何Java对象作为节点嵌入。

4. MissingNode

  • 代表缺失的节点。当访问不存在的字段时,通常返回此类型的节点而不是null
  • 这对于避免NullPointerException非常有用,并可以链式调用多个方法。

在Jackson的JsonNode类中,asXXX()方法系列主要用于从不同类型的ValueNode中安全地提取数据(__value)。这些方法会尝试将节点的值转换为请求的类型,如果节点值不是期望的类型或节点为空,则返回一个默认值(例如,asInt()对于非数值或null节点会返回0)。

示例

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ruoyi-nbcio-plus基于vue3的flowable的websocket消息组件的升级修改(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

winform 入门篇 -- 第15章 表格视图

表格控件 表格视图 DataGridView ,即表格控件提行多行多列的表格状的数据展示 演示: 以表格控件来展示学生数据。。 每个单元格 都可以进行独立的编写 (与上节得不同) 基本操作: 1 添加一个表格控件 DataGridView 2 设置列数、列名 属…

makefile第七讲

更多精彩内容在公众号。 当make执行完后,我们期望将最终的可执行文件安装到系统目录下,这样在不同的目录下都可以执行编译的可执行文件,相当于做成了个命令。这个就需要用到make install。 源文件如下:用于判断系统是小端还是大端…

Canvas使用详细教学:从基础绘图到进阶动画再到实战(海报生成、Flappy Bird 小游戏等),掌握绘图与动画的秘诀

一、Canvas基础 1. Canvas简介 Canvas是HTML5引入的一种基于矢量图形的绘图技术,它是一个嵌入HTML文档中的矩形区域,允许开发者使用JavaScript直接操作其内容进行图形绘制。Canvas元素不包含任何内在的绘图能力,而是提供了一个空白的画布&a…

LeetCode450:删除二叉搜索树中的节点

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤&#xf…

JS-39-underscore01-初识underscore

一、underscore简介 前面我们已经讲过了,JavaScript是函数式编程语言,支持高阶函数和闭包。 函数式编程非常强大,可以写出非常简洁的代码。例如Array的map()和filter()方法: use strict; var a1 [1, 4, 9, 16]; var a2 a1.ma…

代码随想录算法训练营Day1 : 704.二分查找、27.移除元素

二分查找: 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 题目链接:704.二分…

免费泛域名SSL如何申请,和通配符有什么区别

-----让我们明确什么是泛域名。所谓泛域名,是指使用星号(*)作为子域名的占位符,它可以匹配任意子域名。-----而通配符在域名中,它可以出现在主域名的任何位置,它可以用于主域名和子域名的保护。 主要应用场…

抖音取图最新玩法!ai头像壁纸轻松玩转取图项目,取图小程序现成模板快速搭建上线运营。

取图这个项目其实非常有趣且易于上手,尤其适合初学者。今天,我将为你详细解析取图小程序的玩法及操作步骤。 一、原理简述 其核心理念在于,当用户欣赏完你在抖音上的作品后,若对其中的图片或表情包产生兴趣,你可以引…

部署wordpress

查看别名type ll ll 是 ls -l --colorauto 的别名 设置别名alias alias ymyum install -y 使用别名ym nginx 取消别名unalias ym 基于LNMP做一个wordpress nginx mysql 5.7 PHP 7.4 1、linux基本环境 修改主机名 hostnamectl set-hostname $name 关闭防火墙及selinux …

2024年【电工(初级)】新版试题及电工(初级)免费试题

题库来源:安全生产模拟考试一点通公众号小程序 电工(初级)新版试题根据新电工(初级)考试大纲要求,安全生产模拟考试一点通将电工(初级)模拟考试试题进行汇编,组成一套电…

C++11新特性之final关键字

final修饰函数 final修饰函数只能修饰虚函数,防止父类的函数被子类重写 final修饰类 final修饰类防止类被继承

达梦数据库导入导出工具dmfldr

达梦数据库导入导出工具dmfldr 基础信息 OS版本: Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本: DM Database Server 64 V8 DB Version: 0x7000c 03134284132-20240115-215128-200811 dmfldr工具介绍 dmfldr(DM Fast Loade…

【漏洞复现】浙大恩特客户资源管理系统Ri0004_openFileByStream.jsp接口存在任意文件读取漏洞

漏洞描述 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。浙大恩特客户资源管理系统Ri0004_openFileByStream.jsp接口存在任意文件读取漏洞。该漏洞可能会对系统的完整性和安全性产生…

C语言-内存操作函数

C语言有一类内存函数,他们可以以字节为单位进行数据的拷贝、追加,甚至可以替代部分字符串函数。于是让我们来狠狠地学习它一百万遍吧~ 1.memcpy函数的使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 1.1mem…

Java的数组定义和使用

目录 1.前言 2.数组的概念 3.在Java中的创建和初始化 3.1数组的创建 3.2数组的初始化 4.关于使用 4.1数组元素的访问 4.2数组的遍历 4.3length和length()的区别 5.数组其实是引用类型数据 5.1初始JVM的内存分布 5.2基本类型变量与引用类型变量的区别 5.3关于null的认识 5.4设计…

ssm057学生公寓管理中心系统的设计与实现+jsp

学生公寓管理中心系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本学生公寓管理中心系统就是在这样的大环境下诞生,其可以帮助管…

Matlab对多个输入信号进行数值排序提取特定值

1、将多个信号转为一个数组信号输出,在这里需要注意,数据类型是否统一; 2、使用Sort模块,进行排序(可设置排序方向),得到排序后的新数组以及对应的索引号; 3、设置想要的索引号&…

如何使用Postgres的JSONB数据类型进行高效查询

文章目录 解决方案1. 创建包含JSONB列的表2. 插入JSON数据3. 使用GIN索引加速查询4. 执行高效的JSONB查询 示例代码解释 PostgreSQL的JSONB数据类型提供了一种灵活的方式来存储和查询JSON格式的数据。JSONB不仅允许你在PostgreSQL数据库中存储JSON文档,而且还对这些…

文献学习-38-用于增量组织病理学分类的内存高效提示调整

​ Memory-Efficient Prompt Tuning for Incremental Histopathology Classification Authors: Yu Zhu, Kang Li, Lequan Yu, Pheng-Ann Heng Source: The Thirty-Eighth AAAI Conference on Artificial Intelligence (AAAI-24) ​​ Abstract 最近的研究在组织病理学分类方面…