Jackson将Map变量反序列化为空Map而不是null

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,descriptionsnicknames为空.

有没有通用的方法所以每次我有新的地图属性时我都不必添加代码?

Sim*_*erg 5

为地图添加一个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.


far*_*992 5

您可以设置自己的模块和覆盖 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)