Jackson - Unmarshall to Collection / Array

1. Prehľad

Tento návod ukáže, ako na to deserializovať pole JSON na pole Java alebo kolekciu s Jacksonom 2.

Ak chcete kopať hlbšie a učiť sa ďalšie super veci, ktoré môžete s Jacksonom 2 robiť - pokračujte ďalej k hlavnému výukovému programu Jackson.

2. Unmarshall do poľa

Jackson môže ľahko deserializovať na Java Array:

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

3. Unmarshall do zbierky

Čítanie rovnakého poľa JSON do zbierky Java je o niečo zložitejšie - štandardne Jackson nebude môcť získať úplné informácie o všeobecnom type a namiesto toho vytvorí zbierku prepojenýchHashMap prípady:

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

Existujú dva spôsoby, ako pomôcť Jacksonovi porozumieť správnym typovým informáciám - môžeme použiť buď TypeReference poskytnuté knižnicou na tento účel:

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

Alebo môžeme použiť preťažené readValue metóda, ktorá akceptuje a JavaType:

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

Jedna posledná poznámka je, že MyDto trieda musí mať predvolený konštruktor no-args - ak nie, Jackson to nebude schopný vytvoriť:

com.fasterxml.jackson.databind.JsonMappingException: pre typ [jednoduchý typ, trieda org.baeldung.jackson.ignore.MyDto] sa nenašiel vhodný konštruktor: nemožno vytvoriť inštanciu z objektu JSON (je potrebné pridať / povoliť informácie o type?)

4. Záver

Mapovanie polí JSON na zbierky Java je jednou z najbežnejších úloh, na ktoré sa Jackson používa, a tieto riešenia sú životne dôležité pre správne a typovo bezpečné mapovanie.

Implementácia všetkých týchto príkladov a útržkov kódu nájdete v našom projekte GitHub - toto je projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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