Jackson精解第4篇-@JacksonInject与@JsonAlias注解

Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易用,但绝对不是小玩具,更多的内容我会写成一个系列,5-10篇文章,请您继续关注我。
- 《序列化与反序列化核心用法-JSON框架Jackson精解第1篇》
- 《特殊数据格式处理-JSON框架Jackson精解第2篇》
- 《属性序列化自定义排序与字母表排序-JSON框架Jackson精解第3篇》
本节继续为大家介绍在JSON反序列化过程中,如何使用@JacksonInject注解和@JsonAlias注解
一、@JacksonInject注解
在使用JSON格式进行反序列化的时候,我们经常有这样一些需求。我们从客户端或者其他渠道获取了一个JSON格式的数据对象,该对象包含若干个属性。但是我们在将JSON字符串反序列化的时候,需要给它加上一些默认数据,比如:
- responseTime数据响应时间,赋值为当前时间即可;
- 数据反序列化的操作人,赋值为系统当前用户等
客户端返回给我们的数据本身不会携带这些附加信息,这个时候我们就可以使用JacksonInject注解,在JSON字符串反序列化为对象的时候,加上这些附加信息。下面是JacksonInject使用方法
@Data
public class PlayerStar {
private String name;
private Integer age;
private String[] hobbies; //业余爱好,数组
private List<String> friends; // 朋友
private Map<String, BigDecimal> salary; //年收入 Map
@JacksonInject("responseTime") //注意这里
private LocalDateTime responseTime;
}
我们来测试一下反序列化的过程,需要注意的是下文中的jsonInString中并不携带responseTime信息,是我们自己在反序列化的时候注入到java对象中的。
@Test
void testJSON2Object() throws IOException {
//为responseTime赋值为当前值
InjectableValues.Std iv = new InjectableValues.Std();
iv.addValue("responseTime", LocalDateTime.now());
ObjectMapper mapper = new ObjectMapper();
mapper.setInjectableValues(iv); //将可插入值,在反序列化过程中赋值给对象
//将JSON字符串反序列化为java对象
String jsonInString = "{\"name\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";
PlayerStar jordan = mapper.readValue(jsonInString, PlayerStar.class);
System.out.println(jordan);
}
最终的反序列化结果,java 对象的toString()方法输出结果如下,可以看到多出一个responseTime赋值属性,值为当前时间
PlayerStar(name=乔丹, age=45, hobbies=[高尔夫球, 棒球], friends=null, salary=null, responseTime=2020-09-22T06:41:09.192)
二、按照数据类型type进行数据注入
在上文的代码中,JSON字符串反序列化为对象,使用的是属性id的方法进行注入的
@JacksonInject("responseTime") //注意这里responseTime为属性id
private LocalDateTime responseTime;
InjectableValues.Std iv = new InjectableValues.Std();
iv.addValue("responseTime", LocalDateTime.now()); //注意这里responseTime为属性id,而这要统一
除了可以按照属性id进行数据的注入,还可以使用java type数据类型进行数据注入。这种方法在一个java 类中,多个成员变量数据类型重复的时候,比如定义多个LocalDateTime成员变量,用起来就不太方便了。所以还是建议大家使用属性id的方法进行注入数据注入。
@JacksonInject
private LocalDateTime responseTime;
InjectableValues.Std iv = new InjectableValues.Std();
iv.addValue(LocalDateTime.class, LocalDateTime.now()); //注意这里LocalDateTime.class
三、 @JsonAlias注解
当我们在开发过程中,可能在v1.0的版本中我们定义的PlayerStar类(上文)包含name属性,但是我们用着用着发现name这个单词太通用了,在很多的地方都是系统关键字;我们希望在v2.0版本中,给这个成员变量换一个名字,叫做starName,或者playerName。但是我们不希望用户废弃v1.0的接口。
也就是说我们希望做到多版本兼容,客户端传送过来的JSON字符串,可以是name、可以是playerName、可以是starName。我们该怎么做?答案是使用@JsonAlias注解
@Data
public class PlayerStar {
@JsonAlias({"starName", "playerName" })
private String name;
下面三种JSON格式数据都可以被正确的反序列化为PlayerStar对象,并为name成员变量赋值
String jsonInString = "{\"name\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";
String jsonInString = "{\"starName\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";
String jsonInString = "{\"playerName\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
Jackson精解第4篇-@JacksonInject与@JsonAlias注解的更多相关文章
- @JsonCreator自定义反序列化函数-JSON框架Jackson精解第5篇
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...
- URL及日期等特殊数据格式处理-JSON框架Jackson精解第2篇
Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...
- 属性序列化自定义与字母表排序-JSON框架Jackson精解第3篇
Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...
- JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法
Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...
- Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...
- Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...
- JVM内存管理------垃圾搜集器参数精解
本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...
- sed实例精解--例说sed完整版
原文地址:sed实例精解--例说sed完整版 作者:xiaozhenggang 最近在学习shell,怕学了后面忘了前面的就把学习和实验的过程记录下来了.这里是关于sed的,前面有三四篇分开的,现在都 ...
- 《Linux企业应用案例精解(第2版)》新书开始发售
<Linux企业应用案例精解(第2版)>新书开始发售 650) this.width=650;" title="linux企业应用案例精解 第2版" alt= ...
随机推荐
- 如何理解算法时间复杂度的表示法O(n²)、O(n)、O(1)、O(nlogn)等?
先从 来说,理论上哈希表就是O(1).因为哈希表是通过哈希函数来映射的,所以拿到一个关键字,用哈希函数转换一下,就可以直接从表中取出对应的值.和现存数据有多少毫无关系,故而每次执行该操作只需要恒定的时 ...
- Swift Expressible literal
Swift Expressible Literal 引子 从一个面试题说起.有如下代码: struct Book { let name: String } let book: Book = " ...
- 国内几大seo高手(夫唯,王通,久久)的技术分析
http://www.wocaoseo.com/thread-146-1-1.html 目前学习seo的人越来越多了,这种技术的普及和推广也在不断的扩大,先进的好的培训机构不断涌现,很多高水平老师都在 ...
- C语言中存储多个字符串的两种方式
C语言中存储多个字符串的两种方式 方式一 二维字符串数组 声明: char name[][] = { "Justinian", "Momo", " ...
- 《神经网络的梯度推导与代码验证》之CNN的前向传播和反向梯度推导
在FNN(DNN)的前向传播,反向梯度推导以及代码验证中,我们不仅总结了FNN(DNN)这种神经网络结构的前向传播和反向梯度求导公式,还通过tensorflow的自动求微分工具验证了其准确性.在本篇章 ...
- c# 可获取系统环境
c# 可获取系统环境, 启动进程执等 *.shell [MenuItem("Tools/DesignHelper/Clean and Pull")] private sta ...
- Mono集成中使用api获取当前mono 调用堆栈的方法
// 在mono源代码层级中加如下两个api 可以获取堆栈字符串 这两个api我新加的,原来没有.基于原来的代码改的. // add by bodong#if PLATFORM_WIN32 __dec ...
- 【HttpRunner v3.x】笔记 ——5. 测试用例-config
上一篇中,我们了解到了config,在配置中,我们可以配置测试用例级级别的一些设置,比如基础url.验证.变量.导出. 我们一起来看,官方给出的一个例子: from httprunner import ...
- windows-服务器-配置一个及多个-Apache-Tomcat
问题:如何在一台服务器上发布了几个Tomcat的系统???怎么配置环境变量?怎么设置Tomcat? 2020/8月更新,由于之前的java的环境变量有点绕,此次新加一个流程设计图 一.需求: 一台wi ...
- Easy Game(记忆化搜索)
You are playing a two player game. Initially there are n integer numbers in an array and player A an ...