下面的技巧已經爲我工作:
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}
有了這個方法,當給定null
值時,返回的地圖不會在put()
上拋出NullPointerException
。
不幸的是,這篇文章只是關於壓縮序列化過程中的屬性,但我對相反過程感興趣:在反序列化期間抑制屬性。 –
我認爲最好的方法是在json的創建階段排除NULL值。通過這種方式,你根本不會在意它。 –