Jackson常用注解详解

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;@JsonIgnoreprivate 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 {@Overridepublic 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;@JsonCreatorpublic 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;}@JsonValuepublic 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;}@JsonValuepublic 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://xiahunao.cn/news/3281652.html

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

相关文章

【Canvas与艺术】三环莫比乌斯圈

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>三环莫比乌斯圈</title><style type"text/css"&g…

插单现象对PMC造成的影响有哪些?

插单&#xff0c;即在生产制造过程中&#xff0c;客户或其他部门临时增加订单&#xff0c;这一行为如同战场上的突袭&#xff0c;让生产与物料控制&#xff08;PMC&#xff09;部门措手不及&#xff0c;面临着前所未有的压力和挑战。那么&#xff0c;插单现象究竟对PMC造成了哪…

【MATLAB源码-第239期】基于matlab的孔雀优化算法(POA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 孔雀优化算法&#xff08;Peafowl Optimization Algorithm&#xff0c;简称POA&#xff09;以孔雀&#xff08;peafowl&#xff09;的求偶展示行为为灵感&#xff0c;通过模拟这一过程来解决复杂的优化问题。以下是对孔雀优化…

深度揭秘——TCP/IP协议

今天我们要深入探讨一个关键的网络基础知识——TCP/IP协议。无论你是刚接触网络技术的新手&#xff0c;还是希望加深理解的老手&#xff0c;本文都将为你提供全面且易懂的介绍。 TCP/IP协议是一组用于互联网的通信协议的集合&#xff0c;包含了传输控制协议&#xff08;TCP&am…

大数据信用报告查询会不会留下查询记录?怎么选择查询平台?

最近有不少网友都在咨询一个问题&#xff0c;那就是大数据信用报告查询会不会留下查询记录&#xff0c;会不会对自己的征信产生影响&#xff0c;下面本文就详细为大家介绍一下&#xff0c;希望对你了解大数据信用有帮助。 首先、大数据信用与人行征信是独立的 很多人只知道人行…

哪款加密软件好用点?迅软DSE加密软件如何?

在选择加密软件时&#xff0c;好用与否往往取决于多个因素&#xff0c;包括&#xff1a;软件的功能、稳定性、安全性、易用性、兼容性以及性价比等。 针对大家提到的迅软DSE加密软件&#xff0c;以下是一些详细的分析&#xff1a; 一、功能全面 迅软DSE加密系统集成了文件加密…

编译环境搭建(Linux)

0 Preface/Foreword 0.1 System requirement Airoha编译环境&#xff0c;对于Linux distro&#xff0c;建议使用Ubuntu 18.04 1 环境搭建 1.1 Create a working folder 在Linux中&#xff0c;创建一个文件夹&#xff0c;用来存放Airoha释放过来的开发工具链安装包。 博主当…

[数据集][目标检测]船上翻越栏杆危险行为检测数据集VOC+YOLO格式3678张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3678 标注数量(xml文件个数)&#xff1a;3678 标注数量(txt文件个数)&#xff1a;3678 标注…

Linux中新添加的磁盘信息不显示-主动扫盘(刷新磁盘状态)

在Linux系统中&#xff0c;当你新添加了一个磁盘&#xff08;无论是通过物理添加还是虚拟化环境&#xff09;&#xff0c;你可能需要让系统识别这个新磁盘&#xff0c;并且可能需要更新或“刷新”磁盘的状态。这通常涉及到几个步骤&#xff0c;但没有一个直接的“刷新磁盘状态”…

CANoe:System Variables模块介绍

写了这么多文章介绍CANoe的功能和使用,发现竟然没有介绍系统变量模块的,这么重要的功能当然要单独写一篇文章介绍啦! 系统变量为CANoe提供了除数据库、环境变量外的另一种数据配置方式。在系统变量模块中定义的各种数据类型的变量,可以被CANoe其他模块或CAPL程序所引用。 …

四,系统规划

一&#xff0c;企业系统规划法BSP&#xff08;2009、2010、2018&#xff0c;步骤以及优缺点、用到的工具&#xff09; 企业系统规划法&#xff08;Business Systems Planning&#xff0c;BSP&#xff09;是IBM公司20世纪70年代提出的一种结构化的信息系统规划方法。该方法通过…

使用 Postman 进行 Trello API 自动化测试的完整指南

文章目录 前言一、自动化测试是什么&#xff1f;二、比较自动化测试与手工测试1. 自动化测试2. 手工测试 三、环境搭建1.创建Collection2.创建环境变量3.添加API请求 四、设计测试用例1. API简单调用2. 获取所有emoji3. 创建一个新看板&#xff1a;4. 获得创建的看板信息5. 在看…

四、GD32 MCU 常见外设介绍(14)

GD32 MCU内部提供了一个RTC&#xff08;实时时钟&#xff09;模块&#xff0c;通过RTC可以实现日历时钟、闹钟等功能。RTC也可以用于深度睡眠或待机模式的低功耗唤醒。不同系列的GD32 MCU在RTC设计和功能上有所区别&#xff0c;总体可以分为三大系列&#xff1a; &#xff08;…

springboot美食网站—计算机毕业设计源码11574

摘 要 随着人们生活水平的提高&#xff0c;人们对美食的要求也越来越高&#xff0c;对各类美食信息需求越来越大。因此&#xff0c;结合计算机快速发展、普及&#xff0c;在此基础上制作一个页面简单、美观,功能实用的美食网站势在必行&#xff0c;满足用户分享美食的需求。 美…

关于Handler你不知道的事

提到Handler&#xff0c;我们都会想到可以用来在子线程给UI线程发送消息&#xff0c;常用来子线程刷新UI。 而往深了问&#xff0c;你一定还知道Handler会绑定到一个Looper&#xff0c;而每个Looper会和一个MessageQ关联&#xff0c;从而达到向指定线程发送消息的功能。除此之外…

【计算机视觉学习之CV2图像操作实战:红绿灯识别1】

红绿灯识别1 步骤 高斯模糊边缘提取膨胀腐蚀中值滤波再次膨胀霍夫圆环检测区域将图片从BGR格式转换为HSV格式设计颜色阈值中值滤波统计像素点数 import cv2 import numpy as np COLOERS {red: (0, 0, 255),green: (0, 255, 0),yellow: (0, 255, 255), } def detect_color(im…

探索Netty框架的核心构件

Netty是一个高性能、异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能、高可靠性的网络服务器和客户端程序。本文将深入探讨Netty框架的基本组件&#xff0c;帮助开发者更好地理解和使用这一强大的工具。 1. 事件循环&#xff08;EventLoop&#xff09;…

系统架构师--第1章计算机组成与体系结构-1.2 存储器系统

目录 1.2 存储器系统 1.2.1 主存储器 1.2.2 辅助存储器 1.2.3 Cache 存储器 &#xff08;1&#xff09;直接映像 &#xff08;2&#xff09;全相联映像 &#xff08;3&#xff09;组相联映像 1.2 存储器系统 存储器是用来存放程序和数据的部件&#xff0c;它是一个记忆装…

Vue - CSS基础学习

一、元素及属性 CSS 是为 web 内容添加样式的代码。 style标签 1.语法 1.除了选择器部分&#xff0c;每个规则集都应该包含在成对的大括号里&#xff08;{}&#xff09;。 2.在每个声明里要用冒号&#xff08;:&#xff09;将属性与属性值分隔开。 3.在每个规则集里要用分号…