当前位置: 首页 > 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…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...