Gli*_*ide 6 java json jackson deserialization
我正在使用Jackson反序列化一个可能包含Map变量空值的JSON.我想要的是如果值为null,我希望地图是一个空的HashMap而不是null.
JSON:
{"names":null, "descriptions":null, "nicknames":null...}
Run Code Online (Sandbox Code Playgroud)
Java类:
private User {
private Map<String,String> names = new HashMap<>();
private Map<String,String> descriptions = new HashMap<>();
private Map<String,String> nicknames = new HashMap<>();
}
Run Code Online (Sandbox Code Playgroud)
现在,当ObjectMapper反序列化JSON,它覆盖的领域,并集names,descriptions和nicknames为空.
有没有通用的方法所以每次我有新的地图属性时我都不必添加代码?
为地图添加一个setter:
public void setNames(Map<String, String> names) {
this.names = (names == null) ? new HashMap<>() : names;
}
Run Code Online (Sandbox Code Playgroud)
Jackson将检测此setter,并在从JSON读取属性时使用.因此,在您的setter中,您可以检查该值是否为null,如果是,则创建一个新的HashMap.
您可以设置自己的模块和覆盖 getNullValue()
见doc http://jackson.codehaus.org/1.9.9/javadoc/org/codehaus/jackson/map/JsonDeserializer.html
注意
我为所有人注册了解串器Map.class,不那么精确
测试代码
SimpleModule module = new SimpleModule("test", new Version(1, 0, 0, null));
module.addDeserializer(Map.class, new JsonDeserializer<Map>() {
@Override
public Map deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return jp.readValueAs(HashMap.class);
}
@Override
public Map getNullValue() {
return new HashMap();
}
});
mapper.registerModule(module);
Run Code Online (Sandbox Code Playgroud)
测试用例
String s = "{\"names\":{\"1\":2}, \"descriptions\":null, \"nicknames\":null}";
Run Code Online (Sandbox Code Playgroud)
结果
User{descriptions={}, names={1=2}, nicknames={}}
Run Code Online (Sandbox Code Playgroud)