在反序列化期间,被注解属性的值会被注入,而不是从 JSON 中反序列化。如果源 JSON 中没有我们需要的信息时,这时将很有用,我们可以用它设置默认值。
通过 key 注入
public class CurrencyRate {
private String pair;
private double rate;
@JacksonInject("lastUpdated")
private LocalDateTime lastUpdated;
...
}
public class ExampleMain {
public static void main(String[] args) throws JsonProcessingException {
String s = "{\"pair\":\"USD/JPY\",\"rate\":109.15}";
System.out.println("JSON input: " + s);
InjectableValues.Std iv = new InjectableValues.Std();
iv.addValue("lastUpdated", LocalDateTime.now());
ObjectMapper om = new ObjectMapper();
om.setInjectableValues(iv);
CurrencyRate cr = om.readValue(s, CurrencyRate.class);
System.out.println(cr);
}
}
JSON input: {"pair":"USD/JPY","rate":109.15}
CurrencyRate{pair='USD/JPY', rate=109.15, lastUpdated=2021-04-14T22:06:59.131252400}
通过类型注入
想要通过类型注入,需要删除 @JacksonInject
的 value
值:
@JacksonInject
private LocalDateTime lastUpdated;
我们需要使用另一个重载的方法 InjectableValues.Std#addValue()
,它指定类型,而不是 key:
...
InjectableValues.Std iv = new InjectableValues.Std();
iv.addValue(LocalDateTime.class, LocalDateTime.now());
...
原文链接
Jackson JSON - Using @JacksonInject to inject values during deserialization