Я намагаюся десеріалізувати рядок 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);