如何在从JSON反序列化期间忽略具有空值的属性

时间:2015-08-28 11:56:28

标签: java json jackson

我试图将JSON字符串反序列化为ConcurrentHashMap对象,并且因为我的JSON包含具有空值的属性而导致错误,但ConcurrentHashMap不接受空值。这是代码片段:

ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(jsonString, ConcurrentHashMap.class);

有没有办法在反序列化期间忽略具有空值的属性?我知道在序列化过程中我们可以忽略这些属性:

mapper.setSerializationInclusion(JsonInclude.NON_NULL);

但是反序列化过程呢?

2 个答案:

答案 0 :(得分:3)

可能有更好的方法,但解决方法是:

Map<String, Object> map = mapper.readValue(jsonString, HashMap.class);
map.values().removeIf(o -> o == null);
return new ConcurrentHashMap<> (map);

答案 1 :(得分:1)

以下技巧对我有用:

ObjectMapper mapper = new ObjectMapper();

String jsonString = "{\"key1\": 1, \"key2\": null, \"key3\": 3}";

ConcurrentHashMap<String, Object> map = mapper.readValue(jsonString, new ConcurrentHashMap<String, Object>() {
    @Override
    public Object put(String key, Object value) {
        return value != null ? super.put(key, value) : null;
    }
}.getClass());

System.out.println(map); // {key1=1, key3=3}

我们的想法是简单地覆盖ConcurrentHashMap.put()方法,以便忽略要添加到地图中的null值。

您可以创建自己的类ConcurrentHashMap来代替匿名内部类:

public class NullValuesIgnorerConcurrentHashMap<K, V>
    extends ConcurrentHashMap<K, V> {

    @Override
    public V put(K key, V value) {
        return value != null ? super.put(key, value) : null;
    }
}

然后,您将使用此类反序列化为ConcurrentHashMap

ConcurrentHashMap<String, Object> map = 
    mapper.readValue(jsonString, NullValuesIgnorerConcurrentHashMap.class);

System.out.println(map); // {key1=1, key3=3}

使用这种方法,当给定NullPointerException值时,返回的地图永远不会在put()上抛出null