关于spring:Jackson精解第4篇JacksonInject与JsonAlias注解

28次阅读

共计 2846 个字符,预计需要花费 8 分钟才能阅读完成。

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\":[\" 高尔夫球 \",\" 棒球 \"]}";

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

本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com

正文完
 0