Snažím sa deserializovať reťazec JSON do aConcurrentHashMap objekt a dostávam chyby, pretože môj JSON obsahuje vlastnosti s hodnotami null, ale ConcurrentHashMap neprijíma nulové hodnoty. Tu je fragment kódu:
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(jsonString, ConcurrentHashMap.class);
Existuje spôsob, ako ignorovať vlastnosti s nulovými hodnotami počas deserializácie? Viem, že tieto vlastnosti môžeme ignorovať počas serializácie:
mapper.setSerializationInclusion(JsonInclude.NON_NULL);
Ale čo znamená deserializácia?
odpovede:
1 pre odpoveď č. 1Nasledujúci trik pracoval pre mňa:
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}
Myšlienkou je jednoducho prekonať ConcurrentHashMap.put()
tak, aby to ignorovalo null
hodnoty, ktoré sa majú pridať k mape.
Namiesto anonymnej vnútornej triedy by ste mohli vytvoriť svoju vlastnú triedu, od ktorej sa rozširuje 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;
}
}
Potom by ste použili túto triedu na deserializáciu na a ConcurrentHashMap
:
ConcurrentHashMap<String, Object> map =
mapper.readValue(jsonString, NullValuesIgnorerConcurrentHashMap.class);
System.out.println(map); // {key1=1, key3=3}
S týmto prístupom by vrátená mapa nikdy nehádala NullPointerException
na put()
keď je daný a null
hodnota.
3 pre odpoveď č. 2
Možno existuje lepšia cesta, ale riešenie by bolo:
Map<String, Object> map = mapper.readValue(jsonString, HashMap.class);
map.values().removeIf(o -> o == null);
return new ConcurrentHashMap<> (map);