Jackson - Batalkan Pengumpulan / Array

1. Ikhtisar

Tutorial ini akan menunjukkan cara deserialisasi JSON Array ke Java Array atau Collection dengan Jackson 2 .

Jika Anda ingin menggali lebih dalam dan mempelajari hal-hal keren lainnya yang dapat Anda lakukan dengan Jackson 2 - lanjutkan ke tutorial utama Jackson.

2. Membatalkan Array

Jackson dapat dengan mudah melakukan deserialisasi ke Java Array:

@Test public void givenJsonArray_whenDeserializingAsArray_thenCorrect() throws JsonParseException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); List listOfDtos = Lists.newArrayList( new MyDto("a", 1, true), new MyDto("bc", 3, false)); String jsonArray = mapper.writeValueAsString(listOfDtos); // [{"stringValue":"a","intValue":1,"booleanValue":true}, // {"stringValue":"bc","intValue":3,"booleanValue":false}] MyDto[] asArray = mapper.readValue(jsonArray, MyDto[].class); assertThat(asArray[0], instanceOf(MyDto.class)); }

3. Batalkan Pengumpulan

Membaca Array JSON yang sama ke dalam Koleksi Java sedikit lebih sulit - secara default, Jackson tidak akan bisa mendapatkan informasi tipe generik lengkap dan sebaliknya akan membuat kumpulan instance Linked HashMap :

@Test public void givenJsonArray_whenDeserializingAsListWithNoTypeInfo_thenNotCorrect() throws JsonParseException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); List listOfDtos = Lists.newArrayList( new MyDto("a", 1, true), new MyDto("bc", 3, false)); String jsonArray = mapper.writeValueAsString(listOfDtos); List asList = mapper.readValue(jsonArray, List.class); assertThat((Object) asList.get(0), instanceOf(LinkedHashMap.class)); }

Ada dua cara untuk membantu Jackson memahami informasi tipe yang tepat - kita bisa menggunakan TypeReference yang disediakan oleh perpustakaan untuk tujuan ini:

@Test public void givenJsonArray_whenDeserializingAsListWithTypeReferenceHelp_thenCorrect() throws JsonParseException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); List listOfDtos = Lists.newArrayList( new MyDto("a", 1, true), new MyDto("bc", 3, false)); String jsonArray = mapper.writeValueAsString(listOfDtos); List asList = mapper.readValue( jsonArray, new TypeReference
    
     () { }); assertThat(asList.get(0), instanceOf(MyDto.class)); }
    

Atau kita bisa menggunakan metode readValue berlebih yang menerima JavaType :

@Test publi void givenJsonArray_whenDeserializingAsListWithJavaTypeHelp_thenCorrect() throws JsonParseException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); List listOfDtos = Lists.newArrayList( new MyDto("a", 1, true), new MyDto("bc", 3, false)); String jsonArray = mapper.writeValueAsString(listOfDtos); CollectionType javaType = mapper.getTypeFactory() .constructCollectionType(List.class, MyDto.class); List asList = mapper.readValue(jsonArray, javaType); assertThat(asList.get(0), instanceOf(MyDto.class)); }

Satu catatan terakhir adalah bahwa kelas MyDto perlu memiliki konstruktor default no-args - jika tidak, Jackson tidak akan dapat memberi contoh :

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class org.baeldung.jackson.ignore.MyDto]: can not instantiate from JSON object (need to add/enable type information?)

4. Kesimpulan

Memetakan array JSON ke koleksi java adalah salah satu tugas umum yang digunakan Jackson, dan solusi ini sangat penting untuk mendapatkan pemetaan yang benar dan aman jenis .

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