Jackson - Unmarshall do zbirke / niza

1. Pregled

Ovaj vodič će pokazati kako deserializirajte JSON niz u Java niz ili kolekciju pomoću Jacksona 2.

Ako želite dublje kopati i učiti druge cool stvari koje možete raditi s Jacksonom 2 - krenite prema glavnom Jacksonovom vodiču.

2. Unmarshall u Array

Jackson može lako deserializirati Java niz:

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

3. Odustani od zbirke

Čitanje istog JSON niza u Java kolekciji je malo teže - prema zadanim postavkama, Jackson neće moći dobiti potpune informacije o generičkom tipu i umjesto toga stvorit će zbirku PovezanihHashMap primjerci:

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

Postoje dva načina za pomoći Jacksonu da razumije prave informacije o tipu - možemo koristiti TypeReference koju knjižnica pruža upravo u tu svrhu:

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

Ili se možemo poslužiti preopterećenim readValue metoda koja prihvaća a JavaType:

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

Posljednja napomena je da MyDto klasa mora imati zadani konstruktor no-args - ako nema, Jackson to neće moći pokrenuti:

com.fasterxml.jackson.databind.JsonMappingException: Nije pronađen odgovarajući konstruktor za tip [jednostavan tip, klasa org.baeldung.jackson.ignore.MyDto]: nije moguće instanciranje iz JSON objekta (trebate dodati / omogućiti informacije o tipu?)

4. Zaključak

Mapiranje JSON nizova u java kolekcije jedan je od najčešćih zadataka za koji se Jackson koristi i ta rješenja su vitalni za pronalaženje ispravnog, sigurnog mapiranja.

Implementacija svih ovih primjera i isječaka koda možete pronaći u našem GitHub projektu - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo biti lako uvesti i pokrenuti kakav jest.


$config[zx-auto] not found$config[zx-overlay] not found