JSON

2015-08-28 9 views
7

से deserialization के दौरान खाली मूल्यों वाले गुणों को अनदेखा कैसे करें I एक JSON स्ट्रिंग को एक ConcurrentHashMap ऑब्जेक्ट में deserialize करने का प्रयास कर रहा हूं और मुझे त्रुटियां मिल रही हैं क्योंकि मेरे JSON में शून्य मान वाले गुण हैं, लेकिन ConcurrentHashMap शून्य मान स्वीकार नहीं करता है। यहां कोड का टुकड़ा है:JSON

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

deserialization के दौरान शून्य मूल्यों वाले गुणों को अनदेखा करने का कोई तरीका है? मुझे पता है कि हम serialization के दौरान इन गुणों को अनदेखा कर सकते हैं:

mapper.setSerializationInclusion(JsonInclude.NON_NULL); 

लेकिन deserialization प्रक्रिया के बारे में क्या?

+0

दुर्भाग्य से यह पोस्ट केवल क्रमबद्ध करने के दौरान गुणों को दबाने के बारे में है, लेकिन मुझे विपरीत प्रक्रिया में रूचि है: deserializing के दौरान गुणों को दबाने। –

+0

मुझे लगता है कि जेसन के निर्माण चरण के दौरान कुल मूल्यों को बाहर करने का सबसे अच्छा तरीका है। इस तरह से आप इसकी परवाह नहीं करेंगे। –

उत्तर

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<String, Object> map = 
    mapper.readValue(jsonString, NullValuesIgnorerConcurrentHashMap.class); 

System.out.println(map); // {key1=1, key3=3} 
इस के साथ

:

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 को deserialize करने के लिए इस वर्ग का प्रयोग करेंगे:

एक गुमनाम आंतरिक वर्ग के बजाय

, आप फैली कि ConcurrentHashMap से अपने खुद के वर्ग बना सकते हैं दृष्टिकोण, put() पर null मान दिए जाने पर लौटाया गया नक्शा कभी भी NullPointerException फेंक नहीं देगा।

+0

मैंने आपके समाधान का प्रयास किया है, लेकिन यह मेरे लिए काम नहीं करता है। मुझे 'mapper.readValue (jsonString, new typeReference >() { }) का उपयोग करने की आवश्यकता है;' JSON डेटा से नक्शा बनाने के लिए। – theShadow89

+0

@Shadow89 शायद आप '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 का उपयोग करना होगा। जवाब सही है, लेकिन मैं मानचित्र का उपयोग नहीं कर सकता, केवल ConcurrentMap। –

+0

@ RaduDumbrăveanu यह कार्यात्मक रूप से कोई फर्क नहीं पड़ता - आपका नक्शा बाहरी कोड तक पहुंच योग्य नहीं है जब तक कि आप वापस न आएं, तो चाहे यह समवर्ती है या deserialisation समय पर अप्रासंगिक नहीं है ... जब तक आप एक बेहतर तरीका नहीं पाते, मैं बस उस समाधान का उपयोग करता हूं और समस्या को अनदेखा करने के लिए सोनार को बताओ। – assylias