Jackson常用注解详解

news2025/1/23 13:15:05

Hi 👋, I'm shy

有人见尘埃,有人见星辰

SHY QR Code

Jackson常用注解详解

文章目录

  • Jackson常用注解详解
    • 0. 引入依赖
    • 1. @JsonProperty
    • 2. @JsonIgnore
    • 3. @JsonFormat
    • 4. @JsonInclude
    • 5. @JsonCreator
    • 6. @JsonValue
    • 7. @JsonIgnoreProperties
    • 结论

Jackson是Java生态系统中广泛使用的JSON处理库之一。它提供了一系列强大的注解,可以帮助我们更精确地控制Java对象与JSON之间的序列化和反序列化过程。本文将介绍一些常用的Jackson注解及其用法。

0. 引入依赖

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/ -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.17.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.17.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.17.2</version>
        </dependency>
        <!-- 支持xml格式 -->
		<dependency>
		    <groupId>com.fasterxml.jackson.dataformat</groupId>
		    <artifactId>jackson-dataformat-xml</artifactId>
		    <version>2.17.2</version>
		</dependency>

1. @JsonProperty

@JsonProperty注解用于指定Java字段与JSON属性之间的映射关系。

@Data
public class User {
    @JsonProperty("user_name")
    private String name;
}

在上面的例子中,Java对象的name字段将被序列化为JSON中的user_name属性。

2. @JsonIgnore

@JsonIgnore注解用于在序列化过程中忽略某个字段。

@Data
public class User {
    private String name;
    @JsonIgnore
    private String password;
}

在这个例子中,password字段将不会被包含在生成的JSON中。

3. @JsonFormat

@JsonFormat注解用于指定日期/时间字段的格式。

@Data
public class Event {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date timestamp;
}

这个注解将确保timestamp字段被格式化为指定的日期时间格式。

4. @JsonInclude

@JsonInclude注解用于指定在哪些情况下才将属性包含在JSON输出中。这个注解可以应用在类级别或字段级别。

以下是JsonInclude.Include枚举中所有可能的值,以及相应的代码示例:

@Data
public class User {
    // 1. ALWAYS:始终包含属性(默认行为)
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private String alwaysIncluded = "always";
    // 2. NON_NULL:属性为非null时才包含
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String nonNull = null;
    // 3. NON_ABSENT:属性存在且非null时才包含(用于Optional字段)
    @JsonInclude(JsonInclude.Include.NON_ABSENT)
    private Optional<String> optionalField = Optional.empty();
    // 4. NON_EMPTY:属性非空时才包含(适用于集合、数组、字符串等)
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<String> roles = new ArrayList<>();
    // 5. NON_DEFAULT:属性值为非默认值时才包含
    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
    private int age = 0;
    // 6. CUSTOM:使用自定义的ValueFilter来决定是否包含属性
    @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = CustomFilter.class)
    private String customField = "";
    // 7. USE_DEFAULTS:使用默认的包含策略
    @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
    private String useDefaults = "default";
}

// 自定义过滤器
public class CustomFilter {
    @Override
    public boolean equals(Object obj) {
        // 自定义过滤逻辑:只有当字段不为空字符串时才包含
        return obj == null || obj.toString().isEmpty();
    }
}

使用示例:

User user = new User();
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
System.out.println(json);

输出结果如下:

在这里插入图片描述

5. @JsonCreator

@JsonCreator注解用于指定一个构造函数或工厂方法,Jackson将使用它来创建对象实例。这在处理不可变对象或需要特殊逻辑来创建对象时特别有用。

public class User {
    private final String name;
    private final int age;

    @JsonCreator
    public User(@JsonProperty("name") String name, @JsonProperty("age") int age) {
        this.name = name;
        this.age = age;
    }
}

在这个例子中,Jackson会使用这个带注解的构造函数来创建User对象,即使这些字段是final的。@JsonCreator通常与@JsonProperty配合使用,以确保JSON属性正确映射到构造函数参数。

6. @JsonValue

@JsonValue注解用于指定一个方法,该方法的返回值将被用作序列化整个对象的值。这在需要自定义对象的JSON表示时特别有用。

public class Color {
    private final String name;
    private final String hexValue;

    public Color(String name, String hexValue) {
        this.name = name;
        this.hexValue = hexValue;
    }

    @JsonValue
    public String getHexValue() {
        return hexValue;
    }
}

在这个例子中,当序列化Color对象时,JSON输出将只包含hexValue的值,而不是完整的对象结构。例如:

Color red = new Color("Red", "#FF0000");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(red);
System.out.println(json); // 输出: "#FF0000"

@JsonValue注解也可以用于枚举类型,以自定义枚举值的序列化方式:

public enum Status {
    ACTIVE("A"),
    INACTIVE("I");

    private final String code;

    Status(String code) {
        this.code = code;
    }

    @JsonValue
    public String getCode() {
        return code;
    }
}

在这个例子中,Status枚举在序列化时将使用code值而不是枚举名称。

7. @JsonIgnoreProperties

@JsonIgnoreProperties注解用于指定一个或多个应该在序列化/反序列化过程中被忽略的属性。这个注解通常用在类级别。

@JsonIgnoreProperties({"password", "secretKey"})
public class User {
    private String username;
    private String password;  // 这个字段在JSON序列化时会被忽略
    private String secretKey;  // 这个字段在JSON序列化时会被忽略
}

它也可以用来忽略未知属性,这在处理来自外部系统的JSON数据时特别有用:

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private String username;
    private String email;
    // 如果JSON中包含了这个类中没有的属性,它们会被忽略而不会导致异常
}

结论

Jackson注解为我们提供了强大而灵活的工具,可以精确控制JSON序列化和反序列化的过程。通过合理使用这些注解,我们可以轻松处理各种复杂的JSON转换场景,提高代码的可读性和可维护性。

在实际应用中,可能还需要使用其他Jackson注解来满足特定需求。建议查阅Jackson的官方文档以获取更多详细信息和高级用法。

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

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

相关文章

例题:使用一条命令将xxx目录下除了xx子目录之外的文件全部删除(find、管道、grep、exec)

文章目录 例题&#xff1a;删除xx子目录以外的所有目录和文件需求方式一方式二 例题&#xff1a;删除xx子目录以外的所有目录和文件 需求 使用一条命令将/opt目录下除了rh子目录之外的文件全部删除 [rootlocalhost opt]# cp /var/log/vm* /opt/ [rootlocalhost opt]# mkdir …

(一)循环依赖,你真的懂了吗?万字解析循环依赖底层原理 - 什么是Bean循环依赖?Spring是如何解决的?二级缓存可以解决吗?遇到相关报错如何处理?

theme: vuepress 一、相关知识点简介 Spring Boot是基于Spring框架的一个快速开发平台&#xff0c;旨在简化Spring应用的创建和部署。通过提供一系列开箱即用的默认配置和自动化工具&#xff0c;Spring Boot使开发者能够专注于业务逻辑&#xff0c;而无需处理复杂的配置和依赖…

【Python机器学习】支持向量机——在复杂数据上应用核函数

上图中&#xff0c;数据中存在某种可以识别的模式&#xff0c;其中一个问题就是&#xff1a;我们能否想线性情况一样&#xff0c;利用强大的工具来捕捉数据中的这种模式&#xff1f; 利用核函数将数据映射到高维空间 在上图中&#xff0c;数据点处于一个圆中&#xff0c;人类…

《零散知识点 · 自定义 HandleMapping》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

[独家原创] CPO-RBF多特征分类预测 优化宽度+中心值+连接权值 (多输入单输出)Matlab代码

[独家原创] CPO-RBF多特征分类预测 优化宽度中心值连接权值 &#xff08;多输入单输出&#xff09;Matlab代码 目录 [独家原创] CPO-RBF多特征分类预测 优化宽度中心值连接权值 &#xff08;多输入单输出&#xff09;Matlab代码效果一览基本介绍程序设计参考资料 效果一览 基本…

算法--初阶

1、tips 1.1、set求交集 {1,2,3} & {2,3} & {1,2} {2} 其实就是位运算&#xff0c; 只有set可以这样使用&#xff0c; list没有这种用法 {1,2,3} | {2,3, 4} | {1,2} {1, 2, 3, 4} 并集 1.2、*与** * 序列(列表、元组)解包&#xff0c;如果是字典&#xff0c;那…

15.75.【C语言】表达式求值

目录 一.整型提升 1.定义 2. 一.整型提升 1.定义 C语言中整型算术运算总是至少以缺省&#xff08;默认&#xff09;整型类型的精度来进行的。为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升 2.整型提…

C++初学者指南-5.标准库(第二部分)--移除元素算法

C初学者指南-5.标准库(第二部分)–移除元素算法 文章目录 C初学者指南-5.标准库(第二部分)--移除元素算法remove / remove_ifremove_copy / remove_copy_ifunique / unique_copyerase / erase_if相关内容 不熟悉 C 的标准库算法&#xff1f; ⇒ 简介 remove / remove…

还有谁分不清Oracle认证里的OCA、OCP、OCM?

在IT行业&#xff0c;Oracle认证是许多专业人士提升技能和职业竞争力的重要途径。 Oracle认证是一套由Oracle公司提供的全球认可的专业资格认证体系&#xff0c;旨在证明个人在Oracle数据库及相关技术领域的专业技能和知识水平。 Oracle认证作为数据库认证中的天花板&#xff0…

目标检测——GDXray数据集转为YOLO格式

关于该数据集的介绍可以看我写的另一篇博客&#xff1a;链接 论文题目&#xff1a;《GDXray: The Database of X-ray Images for Nondestructive Testing》论文链接&#xff1a;https://link.springer.com/article/10.1007/s10921-015-0315-7 Github链接&#xff1a; https:…

JavaScript小本本|JavaScript 对象方法定义的演变

在微信中阅读&#xff0c;欢迎关注公众号&#xff1a;CodeFit。 创作不易&#xff0c;如果你觉得这篇文章对您有帮助&#xff0c;请不要忘了 点赞、分享 和 关注&#xff0c;为我的 持续创作 提供 动力&#xff01; 欢迎订阅《Vue 3.x 必修课&#xff5c;2024》&#xff1a;htt…

JAVA项目基于SpringBoot的外卖点餐管理系统

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着生活节…

C++20中的模块

大多数C项目使用多个翻译单元(translation units)&#xff0c;因此它们需要在这些单元之间共享声明和定义(share declarations and definitions)。headers的使用在这方面非常突出。模块(module)是一种language feature&#xff0c;用于在翻译单元之间共享声明和定义。它们是某些…

追问试面试系列:Dubbo

欢迎来到Dubbo系列,在面试中被问到Dubbo相关的问题时,大部分都是简历上写了Dubbo,或者面试官想尝试问问你对Dubbo是否了解。 本系列主要是针对面试官通过一个点就使劲儿往下问的情况。 面试官:说说你们项目亮点 好的面试官 我们这个项目的技术亮点在于采用了Spring Cloud…

正点原子imx6ull-mini-Linux驱动之Linux I2C 驱动实验(21)

I2C 是很常用的一个串行通信接口&#xff0c;用于连接各种外设、传感器等器件&#xff0c;在裸机篇已经对 I.MX6U 的 I2C 接口做了详细的讲解。本章我们来学习一下如何在 Linux 下开发 I2C 接口器件 驱动&#xff0c;重点是学习 Linux 下的 I2C 驱动框架&#xff0c;按照指定的…

人工智能深度学习系列—探索Jaccard相似度损失:图像分割领域的新利器

文章目录 1. 背景介绍2. Loss计算公式3. 使用场景4. 代码样例5. 总结 1. 背景介绍 在深度学习的各种应用中&#xff0c;图像分割是一项极具挑战性的任务。Jaccard相似度损失&#xff08;Jaccard Similarity Loss&#xff09;&#xff0c;又称为IoU损失&#xff08;Intersectio…

计算机基本理论与程序运行原理概述

目录 计算机的基本表示方法 计算机的组成 程序运行的原理 指令执行的流水线 编译原理 个人理解 面试题总结 计算机的基本表示方法 计算机系统使用高、低电平来表示逻辑1和0。数据在计算机中的存储、传输和处理均以二进制形式进行。数据通过总线作为电信号进行传输&…

Es6常用的一些数组处理方法

在平时的开发中&#xff0c;我们很多时候用到数组结构数据&#xff0c;那么如何高效处理数组是可以提高开发效率的&#xff0c;现在越来越多人使用es6&#xff0c;那么它的很多方法简化了我们对数据的操作&#xff0c;比如以前数组循环用for循环写比较多的代码&#xff0c;现在…

HTML-07.表格标签

一、要制作的表格如下 二、代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>表格标签<…

探索数据结构:二叉搜索树的递归与非递归实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 二叉搜索树的介绍 二插入搜索树&#xff08;Binary Search Tree&…