Jackson - Unmarshall to Collection / Array

1. Gambaran keseluruhan

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

Sekiranya anda ingin menggali lebih mendalam dan mengetahui perkara menarik lain yang boleh anda lakukan dengan Jackson 2 - teruskan ke tutorial utama Jackson.

2. Unmarshall to Array

Jackson dengan mudah mendesialisasikan 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. Unmarshall ke Koleksi

Membaca JSON Array yang sama ke dalam Koleksi Java sedikit lebih sukar - secara lalai, Jackson tidak akan dapat memperoleh maklumat jenis generik penuh dan sebaliknya akan membuat koleksi contoh HashMap Terpaut :

@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)); }

Terdapat dua cara untuk membantu Jackson memahami maklumat jenis yang betul - kita boleh 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 boleh menggunakan kaedah readValue yang terlalu banyak yang menerima Jenis Java :

@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 ialah kelas MyDto perlu mempunyai konstruktor lalai tanpa argumen - jika tidak, Jackson tidak akan dapat menunjukkannya :

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 yang lebih biasa yang digunakan Jackson, dan penyelesaian ini sangat penting untuk mendapatkan pemetaan yang selamat dan selamat dari jenis .

Pelaksanaan semua contoh dan coretan kod ini terdapat di projek GitHub kami - ini adalah projek berasaskan Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.