/ / Як ігнорувати властивості з порожніми значеннями під час десеріалізації з JSON - java, json, jackson

Як ігнорувати властивості з порожніми значеннями під час десериализации з JSON - java, json, jackson

Я намагаюся десеріалізувати рядок JSON в aОб'єкт ConcurrentHashMap, і я отримую помилки, оскільки мій JSON містить властивості з нульовими значеннями, але ConcurrentHashMap не приймає значення null.

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

Чи є спосіб ігнорувати властивості з нульовими значеннями під час десеріалізації? Я знаю, що ми можемо ігнорувати ці властивості під час серіалізації:

mapper.setSerializationInclusion(JsonInclude.NON_NULL);

Але як щодо процесу десеріалізації?

Відповіді:

1 для відповіді № 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}

При такому підході повернена карта ніколи не викине NullPointerException на put() коли дається a null вартість


3 для відповіді № 2

Можливо, є кращий спосіб, але обхідний шлях:

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