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