以下技巧对我很有用:
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);
这个想法很简单,就是重写
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)
采用这种方法,当给定一个
null
值时,在
put()
中返回的映射永远不会抛出
NullPointerException
。