当前位置: 首页 > news >正文

【Jackson】注解及其使用

Jackson库提供了多种注解(annotations),可以用来控制JSON序列化和反序列化的行为。这些注解允许你灵活地映射Java对象与JSON数据之间的关系。下面将详细介绍一些常用的Jackson注解及其用法。

1. @JsonProperty

作用: 用于指定JSON属性与Java类字段的映射关系。可以用来重命名字段,或指定序列化/反序列化时的字段名。

示例:

import com.fasterxml.jackson.annotation.JsonProperty;public class User {@JsonProperty("user_name")private String name;@JsonProperty("user_age")private int age;// Getter和Setter方法@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

用法:

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonPropertyExample {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();// 创建User对象User user = new User();user.setName("John Doe");user.setAge(30);// 序列化为JSONString jsonString = mapper.writeValueAsString(user);System.out.println(jsonString); // 输出: {"user_name":"John Doe","user_age":30}// 反序列化JSONUser deserializedUser = mapper.readValue(jsonString, User.class);System.out.println(deserializedUser); // 输出: User{name='John Doe', age=30}}
}

2. @JsonIgnore

作用: 用于忽略某个字段,避免将其序列化到JSON中或从JSON中反序列化该字段。

示例:

import com.fasterxml.jackson.annotation.JsonIgnore;public class User {private String name;private int age;@JsonIgnoreprivate String password;// Getter和Setter方法@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

用法:

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonIgnoreExample {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();// 创建User对象User user = new User();user.setName("John Doe");user.setAge(30);user.setPassword("secret");// 序列化为JSONString jsonString = mapper.writeValueAsString(user);System.out.println(jsonString); // 输出: {"name":"John Doe","age":30}}
}

3. @JsonInclude

作用: 用于指定序列化时应包括哪些字段。例如,可以设置为JsonInclude.Include.NON_NULL,仅包括非空字段。

示例:

import com.fasterxml.jackson.annotation.JsonInclude;@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {private String name;private Integer age;  // 使用包装类以允许null值// Getter和Setter方法@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

用法:

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonIncludeExample {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();// 创建User对象User user = new User();user.setName("John Doe");// age字段没有设置值,因此在序列化时将被忽略// 序列化为JSONString jsonString = mapper.writeValueAsString(user);System.out.println(jsonString); // 输出: {"name":"John Doe"}}
}

4. @JsonFormat

作用: 用于指定日期和时间字段的格式化方式。例如,可以指定日期格式。

示例:

import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;public class Event {private String title;@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")private Date eventDate;// Getter和Setter方法@Overridepublic String toString() {return "Event{" +"title='" + title + '\'' +", eventDate=" + eventDate +'}';}
}

用法:

import com.fasterxml.jackson.databind.ObjectMapper;import java.text.SimpleDateFormat;
import java.util.Date;public class JsonFormatExample {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));// 创建Event对象Event event = new Event();event.setTitle("Annual Meeting");event.setEventDate(new Date());// 序列化为JSONString jsonString = mapper.writeValueAsString(event);System.out.println(jsonString); // 输出: {"title":"Annual Meeting","eventDate":"2024-07-25"}}
}

5. @JsonCreator@JsonProperty

作用: @JsonCreator 用于标记构造函数或工厂方法,使Jackson在反序列化时使用这个构造函数或方法。@JsonProperty 用于指定构造函数参数的名称。

示例:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;public class User {private String name;private int age;@JsonCreatorpublic User(@JsonProperty("name") String name, @JsonProperty("age") int age) {this.name = name;this.age = age;}// Getter和Setter方法@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

用法:

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonCreatorExample {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();// JSON字符串String jsonString = "{\"name\":\"John Doe\",\"age\":30}";// 反序列化JSONUser user = mapper.readValue(jsonString, User.class);System.out.println(user); // 输出: User{name='John Doe', age=30}}
}

6. @JsonSetter

作用: 指定反序列化时应调用的方法。可以用来调整字段名的映射。

示例:

import com.fasterxml.jackson.annotation.JsonSetter;public class User {private String name;private int age;@JsonSetter("user_name")public void setName(String name) {this.name = name;}@JsonSetter("user_age")public void setAge(int age) {this.age = age;}// Getter方法@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

用法:

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonSetterExample {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();// JSON字符串String jsonString = "{\"user_name\":\"John Doe\",\"user_age\":30}";// 反序列化JSONUser user = mapper.readValue(jsonString, User.class);System.out.println(user); // 输出: User{name='John Doe', age=30}}
}

7. @JsonDeserialize@JsonSerialize

作用: 用于指定自定义的反序列化和序列化器。可以用来自定义字段的解析和序列化逻辑。

示例:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class Event {private String title;@JsonSerialize(using = CustomDateSerializer.class)@JsonDeserialize(using = CustomDateDeserializer.class)private Date eventDate;// Getter和Setter方法public static class CustomDateSerializer extends JsonSerializer<Date> {private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");@Overridepublic void serialize(Date date, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeString(dateFormat.format(date));}}public static class CustomDateDeserializer extends JsonDeserializer<Date> {private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");@Overridepublic Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {try {return dateFormat.parse(p.getText());} catch (ParseException e) {throw new IOException(e);}}}
}

用法:

import com.fasterxml.jackson.databind.ObjectMapper;import java.text.SimpleDateFormat;
import java.util.Date;public class JsonSerializeDeserializeExample {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));// 创建Event对象Event event = new Event();event.setTitle("Annual Meeting");event.setEventDate(new Date());// 序列化为JSONString jsonString = mapper.writeValueAsString(event);System.out.println(jsonString); // 输出: {"title":"Annual Meeting","eventDate":"2024-07-25"}// 反序列化JSONEvent deserializedEvent = mapper.readValue(jsonString, Event.class);System.out.println(deserializedEvent); // 输出: Event{title='Annual Meeting', eventDate=Tue Jul 25 00:00:00 UTC 2024}}
}

8. @JsonManagedReference@JsonBackReference

作用: 用于处理双向关系中的循环引用问题。@JsonManagedReference 用于标记父对象中的字段,@JsonBackReference 用于标记子对象中的字段。

示例:

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;public class User {private String name;@JsonManagedReferenceprivate Address address;// Getter和Setter方法@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", address=" + address +'}';}
}public class Address {private String street;@JsonBackReferenceprivate User user;// Getter和Setter方法@Overridepublic String toString() {return "Address{" +"street='" + street + '\'' +'}';}
}

用法:

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonManagedBackReferenceExample {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();// 创建User和Address对象User user = new User();user.setName("John Doe");Address address = new Address();address.setStreet("123 Main St");address.setUser(user);user.setAddress(address);// 序列化为JSONString jsonString = mapper.writeValueAsString(user);System.out.println(jsonString); // 输出: {"name":"John Doe","address":{"street":"123 Main St"}}// 反序列化JSONUser deserializedUser = mapper.readValue(jsonString, User.class);System.out.println(deserializedUser); // 输出: User{name='John Doe', address=Address{street='123 Main St'}}}
}

9. @JsonAlias

作用: 允许字段有多个别名,以便在反序列化时接受不同名称的JSON属性。

示例:

import com.fasterxml.jackson.annotation.JsonAlias;public class User {@JsonAlias({"username", "user_name"})private String name;@JsonAlias({"userage", "user_age"})private int age;// Getter和Setter方法@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

用法:

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonAliasExample {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();// JSON字符串String jsonString = "{\"username\":\"John Doe\",\"userage\":30}";// 反序列化JSONUser user = mapper.readValue(jsonString, User.class);System.out.println(user); // 输出: User{name='John Doe', age=30}}
}

10. @JsonUnwrapped

作用: 将嵌套对象的属性“展开”到父对象中。这在处理嵌套结构时特别有用。

示例:

import com.fasterxml.jackson.annotation.JsonUnwrapped;public class User {private String name;private int age;@JsonUnwrappedprivate Address address;// Getter和Setter方法@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", address=" + address +'}';}
}public class Address {private String street;private String city;// Getter和Setter方法@Overridepublic String toString() {return "Address{" +"street='" + street + '\'' +", city='" + city + '\'' +'}';}
}

用法:

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonUnwrappedExample {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();// 创建User和Address对象User user = new User();user.setName("John Doe");user.setAge(30);Address address = new Address();address.setStreet("123 Main St");address.setCity("Springfield");user.setAddress(address);// 序列化为JSONString jsonString = mapper.writeValueAsString(user);System.out.println(jsonString); // 输出: {"name":"John Doe","age":30,"street":"123 Main St","city":"Springfield"}// 反序列化JSONUser deserializedUser = mapper.readValue(jsonString, User.class);System.out.println(deserializedUser); // 输出: User{name='John Doe', age=30, address=Address{street='123 Main St', city='Springfield'}}}
}

总结

Jackson库中的注解可以帮助你灵活地控制JSON数据的序列化和反序列化过程。通过合理使用这些注解,你可以实现字段重命名、忽略字段、设置字段包含策略、处理日期格式、定义自定义序列化和反序列化逻辑、解决循环引用问题、多态处理等功能。这些功能使得Jackson在处理复杂JSON数据时非常强大和灵活。

相关文章:

【Jackson】注解及其使用

Jackson库提供了多种注解&#xff08;annotations&#xff09;&#xff0c;可以用来控制JSON序列化和反序列化的行为。这些注解允许你灵活地映射Java对象与JSON数据之间的关系。下面将详细介绍一些常用的Jackson注解及其用法。 1. JsonProperty 作用: 用于指定JSON属性与Java…...

LeetCode24 两两交换链表中的节点

前言 题目&#xff1a; 24. 两两交换链表中的节点 文档&#xff1a; 代码随想录——两两交换链表中的节点 编程语言&#xff1a; C 解题状态&#xff1a; 没画图&#xff0c;被绕进去了… 思路 思路还是挺清晰的&#xff0c;就是简单的模拟&#xff0c;但是一定要搞清楚交换的…...

AI OS

一&#xff0c;概念 AI OS, 或AI for OS&#xff0c;也就是近一年来伴随着人工智能的热度而衍生出的一个新的概念 - 人工智能操作系统。 为什么提出AI OS的概念&#xff1f; 这是因为人工智能技术的发展势头太过迅猛&#xff0c;尤其在深度学习、大模型等AI技术的突破后&…...

Dubbo 黑白名单机制详解

在微服务架构中&#xff0c;服务间的安全和流量控制是非常重要的。在众多 Java 微服务框架中&#xff0c;Apache Dubbo 作为一款高性能的 RPC 框架&#xff0c;提供了丰富的功能来管理服务调用。在 Dubbo 中&#xff0c;黑白名单机制是保障服务安全性和可控性的一个重要手段。本…...

配电房智能巡检机器人怎么选?

智能巡检机器人行业发展现状 2022年中国智能巡检机器人市场规模达到了15.66亿元。其中&#xff1a;电力智能巡检机器人规模14.88亿元&#xff0c;其他智能巡检机器人规模为0.78亿元。2023年中国智能巡检机器人市场规模约为19.71亿元。其中&#xff1a;电力智能巡检机器人规模…...

husky引发git commit报错的解决方案

在git commit的时候&#xff0c;有可能会遇到这样的报错&#xff0c;husky - pre-commit hook exited with code 1 (error) 出现这个问题的原因主要是&#xff0c;假如项目中采用 husky和lint-staged结合进行代码校验&#xff0c;那么&#xff0c;只要项目代码中有不规范的地方…...

韩顺平0基础学Java——第37天

p736-758 MySQL三层结构 1.所谓安装Mysql数据库&#xff0c;就是在主机安装一个数据库管理系统(DBMS)&#xff0c;这个管理程序可以管理多个数据库。DBMS(database manage system) 2.一个数据库中可以创建多个表,以保存数据(信息)。 3.数据库管理系统(DBMS)、数据库和表的关系…...

Layer2区块链扩容方案(1)——总述

写在前面 这篇文章作为一个简单介绍&#xff0c;很多技术只是大致提及或者引用&#xff0c;之后会在详细学习后逐项解释。 补充知识 在了解扩容方案之前&#xff0c;我们最好了解一些相关的知识概念 EVM “EVM” 是“Ethereum Virtual Machine”&#xff08;以太坊虚拟机&…...

AWS监控工具,监控性能指标

执行AWS监视是为了跟踪在AWS环境中主动运行的应用程序工作负载和资源&#xff0c;AWS监视器跟踪各种AWS云指标&#xff0c;以帮助提高在其上运行的应用程序的整体性能。 借助阈值突破警报系统&#xff0c;AWS应用程序监控在识别性能瓶颈来源方面起着至关重要的作用&#xff0c…...

义务外贸wordpress独立站主题

健身器材wordpress网站模板 跑步机、椭圆机、划船机、动感单车、健身车、深蹲架、龙门架、健身器材wordpress网站模板。 https://www.jianzhanpress.com/?p4251 农业机械wordpress网站模板 植保机械、畜牧养殖机械、农机配件、土壤耕整机械、农业机械wordpress网站模板。 …...

初等数论精解【4】

文章目录 算术基本定理基础理论整数运算规则1. 加法性质2. 减法性质3. 乘法性质4. 除法性质5. 其他性质 整数运算的性质整数构成域吗 参考文献 算术基本定理 基础 任何一个大于1的整数可以被分解为素因数的连乘积。 a p 1 p 2 . . . . p n ≥ 1 ap_1\times p_2....\times…...

MongoDB教程(二十二):MongoDB固定集合

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、固定集…...

20240724----idea的Java环境卸载与安装

1.删除旧有的jdk https://blog.csdn.net/weixin_42168713/article/details/112162099 &#xff08;补充&#xff1a;我把用户变量和java有关的都删了&#xff09; 2.下载新的jdk百度网盘链接 链接&#xff1a;https://pan.baidu.com/s/1gkuLoxBuRAtIB1IzUTmfyQ 提取码&#xf…...

C语言 ——— 函数指针数组的讲解及其用法

目录 前言 函数指针数组的定义 函数指针数组的使用 前言 数组是存放一组相同类型数据的存储空间 关于指针数组的知识请见&#xff1a;C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 那么要将多个函数的地址存储到数组中&#xff0c;这个数组该如何定义…...

鸿蒙仓颉语言【cryptocj 库】(介绍与SHA、MD5、HMAC摘要算法)

cryptocj 库 介绍 cryptocj 是一个安全的密码库&#xff0c;包括常用的密码算法、常用的密钥生成和签名验证。 该库是对 C 语言的 openSSL 封装的仓颉加密算法 1 提供SHA、MD5、HMAC摘要算法。 前置条件&#xff1a;NA 场景&#xff1a; OHOS&#xff0c; Linux&#xff…...

设计App的后端接口分类以及环境依赖包详情

目录 App的后端接口分类 1. 用户登录与注册 2. 设备初始化 3. 广告与推广 4. 应用配置与功能 5. 支付系统 6. 内容分发 7. 资源下载 8. 视频内容 9. 用户行为分析 10. 安全与合规 设计建议 基于Easyswoole&#xff0c;可以在系统中引入需要的一些常见依赖包&#…...

接入百度文心一言API教程

然后&#xff0c;编辑文章。点击AI识别摘要&#xff0c;然后保存即可 COREAIPOWER设置 暂时只支持经典编辑器.古腾堡编辑器等几个版本后支持.在比期间,你可以自己写点摘要 摘要内容 AL识别摘要 清空 若有收获&#xff0c;就点个赞吧 接入文心一言 现在百度文心一言&…...

classfinal太强了,再也不怕被反编译了

这段时间在辛辛苦苦的编写一个算法程序&#xff0c;担心部署到客户服务器&#xff0c;客户反编译jar包&#xff0c;破解程序&#xff0c;那努力就白费了&#xff01; 在网上查询&#xff0c;发现个好东东&#xff0c;classfinal可以加密jar包&#xff0c;防止反编译&#xff0…...

DP-适配器模式代码重新理解

package com.designpatterns.adapter;/*** 定义鸭子接口*/ public interface Duck {/*** 定义鸭子呱呱叫(quack)*/public void quack();public void fly(); }package com.designpatterns.adapter;/*** 实现一个绿头鸭*/ public class MallarDuck implements Duck{Overridepubl…...

minio安装小计一则

安装minio并且使用api方式对文件进行操作 本文使用docker安装 docker pull minio/minio docker pull minio/mc &#xff08;mc为minio文件运行命令行工具&#xff09; 使用如下命令运行Minio服务器容器&#xff1a; windwos powershell运行命令 docker run -p 9000:9000…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...