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://www.rhkb.cn/news/386676.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis学习[1] ——基本概念和数据类型

Redis学习[1] ——基本概念和数据类型 一、Redis基础概念 1.1 Redis是什么&#xff0c;有什么特点&#xff1f; Redis是一个基于**内存的数据库&#xff0c;因此读写速度非常快**&#xff0c;常用作缓存、消息队列、分布式锁和键值存储数据库。支持多种数据结构&#xff1a;…

大数据与人工智能:数据隐私与安全的挑战_ai 和 数据隐私

前言 1.背景介绍 随着人工智能(AI)和大数据技术的不断发展&#xff0c;我们的生活、工作和社会都在不断变化。这些技术为我们提供了许多好处&#xff0c;但同时也带来了一系列挑战&#xff0c;其中数据隐私和安全是最为关键的之一。数据隐私和安全问题的出现&#xff0c;主要…

分布式锁的三种实现方式:Redis、基于数据库和Zookeeper

分布式锁的实现 操作共享资源&#xff1a;例如操作数据库中的唯一用户数据、订单系统、优惠券系统、积分系统等&#xff0c;这些系统需要修改用户数据&#xff0c;而多个系统可能同时修改同一份数据&#xff0c;这时就需要使用分布式锁来控制访问&#xff0c;防止数据不一致。…

angular入门基础教程(九)依赖注入(DI)

依赖注入 Angular 中的依赖注入&#xff08;DI&#xff09;是框架最强大的特性之一。可以将依赖注入视为 Angular 在运行时为你的应用 提供所需资源的能力。依赖项可以是服务或其他资源。 使用服务的一种方式是作为与数据和 API 交互的方式。为了使服务可重用&#xff0c;应该…

实战:ZooKeeper 操作命令和集群部署

ZooKeeper 操作命令 ZooKeeper的操作命令主要用于对ZooKeeper服务中的节点进行创建、查看、修改和删除等操作。以下是一些常用的ZooKeeper操作命令及其说明&#xff1a; 一、启动与连接 启动ZooKeeper服务器&#xff1a; ./zkServer.sh start这个命令用于启动ZooKeeper服务器…

SSM学习9:SpringBoot简介、创建项目、配置文件、多环节配置

简介 SpringBoot式用来简化Spring应用的初始搭建以及开发过程的一个框架 项目搭建 File -> New -> Project 选中pom.xml文件&#xff0c;设置为maven项目 项目启动成功 可以访问BasicController中的路径 配置文件 在resources目录下 application.properties 默…

Linux——管理本地用户和组(详细介绍了Linux中用户和组的概念及用法)

目录 一、用户和组概念 &#xff08;一&#xff09;、用户的概念 &#xff08;二&#xff09;、组的概念 补充组 主要组 二、获取超级用户访问权限 &#xff08;一&#xff09;、su 命令和su -命令 &#xff08; 二&#xff09;、sudo命令 三、管理本地用户账户 &…

WPF---Prism视图传参

Prism视图传参方式。 实际应用场景 点击tabitem中的列表数据&#xff0c;同步更新到ListStatic Region对应的界面。目前用两种方式实现了传参数据同步。 第一&#xff0c;事件聚合器&#xff08;EventAggregator&#xff09; 1. 定义事件 创建一个事件类&#xff0c;用于传…

微信小程序配置访问服务器失败所发现的问题及解决方案

目录 事前现象问题1&#xff1a;问题现象&#xff1a;问题分析&#xff1a; 问题2&#xff1a;问题现象&#xff1a;问题分析&#xff1a;解决方案&#xff1a; 事后现象 事前现象 问题1&#xff1a; 问题现象&#xff1a; 在本地调试时&#xff0c;一切顺利&#xff0c;但一…

JAVA开源的html转pdf、png转pdf项目

总览 Open HTML to PDF是一个纯Java库,用于使用CSS 2.1(以及更高版本的标准)对合理子集的格式良好的XML/XHTML(甚至一些HTML5)进行布局和格式化,输出为PDF或图像。 使用该库生成漂亮的PDF文档。但请注意,您不能将现代HTML5+直接应用于该引擎并期望获得出色的结果。您必…

妈吖,看过这个大厂的oracle主键自增,我的信心暴增!信创,国产数据库也能行。

创作不易 只因热爱!! 热衷分享&#xff0c;一起成长! “你的鼓励就是我努力付出的动力” 1.数据库oracle自增主键字段思维导图 在Oracle数据库中&#xff0c;可以通过创建序列&#xff08;SEQUENCE&#xff09;来实现自增功能。但也可以不在数据库中实现&#xff0c;而是通过程…

Docker中使用自定义网络方式实现Redis集群部署与测试流程

场景 Docker中Docker网络-理解Docker0与自定义网络的使用示例&#xff1a; Docker中Docker网络-理解Docker0与自定义网络的使用示例-CSDN博客 参考上面的流程实现自定义网络的实现。 下面记录其应用实例&#xff0c;使用Docker的自定义网络实现redis集群部署。 注&#xf…

vue3数据结构的渲染01

处理数据&#xff1a; //现有原始数据showCertificateUrl “url01;url02” 使用以下代码将两条通过分号";"分割的url进行处理 const parseUrls () > {urls.value [];// 每次重新赋值前一定要清空之前的旧数据&#xff01;if (!showCertificateUrl.value) {retu…

数模打怪(八)之图论模型

一、作图 图的数学语言描述&#xff1a; G( V(G), E(G) )&#xff0c;G&#xff08;graph&#xff09;&#xff1a;图&#xff0c;V&#xff08;vertex&#xff09;&#xff1a;顶点集&#xff0c;E&#xff08;edge&#xff09;&#xff1a;边集 1、在线作图 https://csac…

自闭症儿童能否上学:家长的选择与困惑

在自闭症儿童的成长旅程中&#xff0c;上学这一关键议题常常使家长陷入异常艰难的抉择和无尽的困惑之中。对于自闭症儿童究竟能否上学&#xff0c;家长们不得不面对众多纷繁复杂且至关重要的考量因素。 一方面&#xff0c;家长们怀揣着美好的期望&#xff0c;渴望孩子能够融入正…

C# 使用pythonnet 迁入 python 初始化错误解决办法

pythonnet 从 3.0 版本开始&#xff0c;必须设置Runtime.PythonDLL属性或环境变量 例如&#xff1a; string pathToVirtualEnv ".\\envs\\pythonnetTest"; Runtime.PythonDLL Path.Combine(pathToVirtualEnv, "python39.dll"); PythonEngine.PythonHom…

知识图谱增强的RAG(KG-RAG)详细解析

转自&#xff1a;知识图谱科技 这是一个与任务无关的框架&#xff0c;它将知识图谱&#xff08;KG&#xff09;的显性知识与大型语言模型&#xff08;LLM&#xff09;的隐含知识结合起来。这是该工作的arXiv预印本 https://arxiv.org/abs/2311.17330 。 我们在这里利用一个名为…

linux中mysql的安装使用(普通版版本+docker版本)

linux中mysql的安装使用 一、普通安装1.下载安装包2.流程 二、用docker安装1.拉取mysql镜像2.启动镜像3.开启权限第一种情况第二种情况 三、用Navicat连接 一、普通安装 1.下载安装包 挑选个你喜欢的目录&#xff0c;用wget下载并且解压 wget http://dev.mysql.com/get/Down…

Java人力资源招聘社会校招类型招聘系统PC端

&#x1f50d;【揭秘】人力资源新利器&#xff01;社会校招一站式PC端招聘系统全攻略&#x1f680; &#x1f308; 开篇引言&#xff1a;招聘新纪元&#xff0c;效率为王&#xff01; Hey小伙伴们&#xff0c;你是否还在为繁琐的招聘流程头疼不已&#xff1f;&#x1f92f; 面…

京东商品详情API:多规格商品的返回值处理

处理京东商品详情API中关于多规格商品的返回值&#xff0c;首先需要了解京东API的返回数据结构。通常&#xff0c;对于多规格商品&#xff08;如不同颜色、尺寸等选项的商品&#xff09;&#xff0c;API会返回一个包含多个规格选项和对应价格、库存等信息的复杂数据结构。 以下…