Джаксън - Работа с карти и нули

1. Общ преглед

В тази бърза статия ще разгледаме по-усъвършенстван случай на използване на Джаксън - работа с Карти, които съдържат нулеви стойности или нулеви ключове .

2. Игнорирайте нулевите стойности в карта

Джаксън има прост, но полезен начин за глобален контрол на това, което се случва с нулеви стойности, когато Карта сериализира:

ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL);

Сега всяка нулева стойност в обект Map, сериализиран чрез този mapper, ще бъде игнорирана:

@Test public void givenIgnoringNullValuesInMap_whenWritingMapObjectWithNullValue_thenIgnored() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL); MyDto dtoObject1 = new MyDto(); Map dtoMap = new HashMap(); dtoMap.put("dtoObject1", dtoObject1); dtoMap.put("dtoObject2", null); String dtoMapAsString = mapper.writeValueAsString(dtoMap); assertThat(dtoMapAsString, containsString("dtoObject1")); assertThat(dtoMapAsString, not(containsString("dtoObject2"))); }

3. Сериализиране на карта с нулев ключ

По подразбиране Джаксън не позволява сериализиране на карта с нулев ключ . Ако се опитате да напишете такава карта, ще получите следното изключение:

c.f.j.c.JsonGenerationException: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) at c.f.j.d.s.i.FailingSerializer.serialize(FailingSerializer.java:36)

Библиотеката обаче е достатъчно гъвкава, за да можете да дефинирате персонализиран сериализатор с нулев ключ и да замените поведението по подразбиране:

class MyDtoNullKeySerializer extends StdSerializer { public MyDtoNullKeySerializer() { this(null); } public MyDtoNullKeySerializer(Class t) { super(t); } @Override public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused) throws IOException, JsonProcessingException { jsonGenerator.writeFieldName(""); } }

Сега картата с нулев ключ ще работи добре - и нулевият ключ ще бъде записан като празен низ:

@Test public void givenAllowingMapObjectWithNullKey_whenWriting_thenCorrect() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); mapper.getSerializerProvider().setNullKeySerializer(new MyDtoNullKeySerializer()); MyDto dtoObject = new MyDto(); dtoObject.setStringValue("dtoObjectString"); Map dtoMap = new HashMap(); dtoMap.put(null, dtoObject); String dtoMapAsString = mapper.writeValueAsString(dtoMap); assertThat(dtoMapAsString, containsString("\"\"")); assertThat(dtoMapAsString, containsString("dtoObjectString")); }

4. Игнорирайте нулевите полета

Освен Maps, Jackson предоставя много конфигурация и гъвкавост за игнориране / работа с нулеви полета като цяло. Можете да разгледате този урок, за да видите как точно работи това.

5. Заключение

Сериализирането на обект на Map е достатъчно често, за да се нуждаем от библиотека, която да се справя добре с нюансите на процеса на сериализация. Jackson предлага няколко удобни опции за персонализиране, които да ви помогнат да оформите резултата от този процес на сериализация доста добре.

Той също така предоставя много солидни начини за работа с колекции в по-общ смисъл.

Внедряването на всички тези примери и кодови фрагменти може да се намери в над на GitHub - това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.