/ Ako ignorovať vlastnosti s prázdnymi hodnotami počas deserializácie z JSON - java, json, jackson

Ako ignorovať vlastnosti s prázdnymi hodnotami počas deserializácie z JSON - java, json, jackson

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ď č. 1

Nasledujú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);