2015-08-28 90 views
7

我試圖將JSON字符串反序列化爲ConcurrentHashMap對象,並且出現錯誤,因爲我的JSON包含具有空值的屬性,但ConcurrentHashMap不接受空值。這裏是代碼片段:如何在JSON反序列化過程中忽略具有空值的屬性

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

有沒有辦法在反序列化過程中忽略空值的屬性?我知道,我們可以序列化過程中忽略這些屬性:

mapper.setSerializationInclusion(JsonInclude.NON_NULL); 

但對於反序列化進程?

+0

不幸的是,這篇文章只是關於壓縮序列化過程中的屬性,但我對相反過程感興趣:在反序列化期間抑制屬性。 –

+0

我認爲最好的方法是在json的創建階段排除NULL值。通過這種方式,你根本不會在意它。 –

回答

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} 

有了這個方法,當給定null值時,返回的地圖不會在put()上拋出NullPointerException

+0

我嘗試了您的解決方案,但它對我無效。我需要使用'mapper.readValue(jsonString,new TypeReference >(){}};'從JSON數據創建一個映射。 – theShadow89

+0

@ theShadow89也許你可以使用'mapper.readValue(jsonString,new TypeReference >(){}',因爲'NullValuesIgnorerConcurrentHashMap'類型是通用的。 –

3

有可能是一個更好的辦法,但一個解決辦法是:

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

因爲聲納,我必須使用ConcurrentHashMap。答案很完美,但我不能使用Map,只能使用ConcurrentMap。 –

+0

@RaduDumbrăveanu它在功能上沒有區別 - 在返回之前,您的映射無法通過外部代碼訪問,因此在反序列化時無論它是併發還是不相關......除非您找到更好的方法,否則我只會使用該解決方案並告訴Sonar忽略這個問題。 – assylias

相關問題