Jackson - Bekerja dengan Maps dan nulls

1. Ikhtisar

Dalam artikel singkat ini, kita akan melihat kasus penggunaan yang lebih canggih dalam menggunakan Jackson - bekerja dengan Maps yang berisi nilai null atau kunci null .

2. Abaikan Nilai Nulls di Peta

Jackson memiliki cara sederhana namun berguna untuk mengontrol secara global apa yang terjadi pada nilai null ketika Peta menjadi serial:

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

Sekarang nilai null apa pun dalam objek Map yang diserialkan melalui mapper ini akan diabaikan:

@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. Membuat Serial Peta Dengan Kunci Null

Secara default, Jackson tidak mengizinkan serialisasi Peta dengan kunci null . Jika Anda mencoba untuk menulis peta seperti itu, Anda akan mendapatkan pengecualian berikut:

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)

Namun pustaka tersebut cukup fleksibel sehingga Anda dapat menentukan serializer kunci null kustom dan mengganti perilaku default:

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(""); } }

Sekarang Peta dengan kunci null akan berfungsi dengan baik - dan kunci null akan ditulis sebagai String kosong:

@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. Abaikan Field Null

Selain Maps, Jackson menyediakan banyak konfigurasi dan fleksibilitas untuk mengabaikan / bekerja dengan bidang null secara umum. Anda dapat melihat tutorial ini untuk melihat cara kerjanya.

5. Kesimpulan

Membuat serial objek Map cukup umum sehingga kita membutuhkan perpustakaan yang mampu menangani nuansa proses serialisasi dengan baik. Jackson menyediakan beberapa opsi penyesuaian yang berguna untuk membantu Anda membentuk keluaran dari proses serialisasi ini dengan cukup baik.

Ini juga memberikan banyak cara yang solid untuk bekerja dengan koleksi dalam arti yang lebih umum.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di lebih dari GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankan apa adanya.