Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易用,但绝对不是小玩具,更多的内容我会写成一个系列,5-10篇文章,请您继续关注我。

本节继续为大家介绍在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\":[\"高尔夫球\",\"棒球\"]}";

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

Jackson精解第4篇-@JacksonInject与@JsonAlias注解的更多相关文章

  1. @JsonCreator自定义反序列化函数-JSON框架Jackson精解第5篇

    Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...

  2. URL及日期等特殊数据格式处理-JSON框架Jackson精解第2篇

    Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...

  3. 属性序列化自定义与字母表排序-JSON框架Jackson精解第3篇

    Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...

  4. JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法

    Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...

  5. Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换

    Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...

  6. Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo

    Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...

  7. JVM内存管理------垃圾搜集器参数精解

    本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...

  8. sed实例精解--例说sed完整版

    原文地址:sed实例精解--例说sed完整版 作者:xiaozhenggang 最近在学习shell,怕学了后面忘了前面的就把学习和实验的过程记录下来了.这里是关于sed的,前面有三四篇分开的,现在都 ...

  9. 《Linux企业应用案例精解(第2版)》新书开始发售

    <Linux企业应用案例精解(第2版)>新书开始发售 650) this.width=650;" title="linux企业应用案例精解 第2版" alt= ...

随机推荐

  1. eclipse及idea使用问题记录

    使用eclipse或idea的时候会遇到各式各样的小问题,解决方案其实网上也大都搜得到,但是下次遇到的时候总是想不起来如何解决,还要花费时间再次查资料.所以以后把遇到的问题都记录一下. Eclipse ...

  2. gorilla/mux 的学习

    原文链接:gorilla/mux的学习 源代码: package main import ( "encoding/json" "fmt" "githu ...

  3. 基于 abp vNext 微服务开发的敏捷应用构建平台 - 项目介绍

    缘起 目前使用ABP框架已经将近3年了,大大小小的项目也陆陆续续做了很多.由于现有信息系统的架构模式是在底层的技术平台上直接构建信息系统并采用技术主导,使用业务无关的编程工具来开发信息系统的缺陷使得系 ...

  4. 操作系统-存储管理(5)IA-32/Linux的地址转换

    IA-32/Linux按字节编址:在保护模式下,IA-32采用段页式虚拟存储管理方式,存储地址采用逻辑地址.线性地址和物理地址来进行描述. 逻辑地址由48位组成,包含16位段选择符(高13位为段表项的 ...

  5. python字典的概念与基本操作

    字典是非常常用的一种数据结构,它与json格式的数据非常相似,核心就是以键值对的形式存储数据,关于Python中的字典做如下四点说明: 1.构造字典对象需要用大括号表示 {},每个字典元素都是以键值对 ...

  6. CODING DevOps 代码质量实战系列第一课:代码规范与 Git Flow

    讲师介绍 杨周 CODING DevOps 架构师 CODING 布道师 连续创业者.DIY/Linux 玩家.知乎小 V,曾在创新工场.百度担任后端开发.十余年一线研发和带队经验,经历了 ToB.T ...

  7. JMH-大厂是如何使用JMH进行Java代码性能测试的?必须掌握!

    Java 性能测试难题 现在的 JVM 已经越来越为智能,它可以在编译阶段.加载阶段.运行阶段对代码进行优化.比如你写了一段不怎么聪明的代码,到了 JVM 这里,它发现几处可以优化的地方,就顺手帮你优 ...

  8. vs2015创建项目没法选择.net2.0的问题

    今天要修护一个net2.0开发的程序bug,只修改了一行代码,发布到测试系统,结果程序奔溃了,吓出一身汗. 因为是直接崩溃,所以第一个想到的就是.net版本错了.一查看,果实是,项目属性里目标框架是4 ...

  9. Linux安装Rabbitmq3.8.5

    安装环境: 操作系统为:centOS-7 erlang版本为22.3,软件包:otp_src_22.3.tar.gz rabbitMQ版本为3.8.5,软件包:rabbitmq-server-gene ...

  10. Unity Plugins的使用方法

    一.为插件设置平台的方法 unity5之前,是通过把插件搞到对应目录进行区分平台的(比如在build target是ios平台时只把IOS目录的插件build进去),unity5之后提供了设置平台/c ...