Komme i gang med tilpasset deserialisering i Jackson

1. Oversikt

Denne raske opplæringen vil illustrere hvordan du bruker Jackson 2 til å deserialisere JSON ved hjelp av en tilpasset deserializer.

Hvis du vil grave dypere og lære andre kule ting du kan gjøre med Jackson 2 - gå videre til hovedveiledningen for Jackson.

2. Standard deserialisering

La oss starte med å definere to enheter og se hvordan Jackson vil deserialisere en JSON-representasjon til disse enhetene uten tilpasning:

public class User {public int id; offentlig streng navn; } public class Item {public int id; offentlig streng elementnavn; offentlig bruker eier; }

La oss nå definere JSON-representasjonen vi vil deserialisere:

{"id": 1, "itemName": "theItem", "eier": {"id": 2, "name": "theUser"}}

Og til slutt, la oss oppheve denne JSON til Java-enheter:

Item itemWithOwner = new ObjectMapper (). ReadValue (json, Item.class);

3. Custom Deserializer på ObjectMapper

I forrige eksempel samsvarte JSON-representasjonen perfekt med Java-enhetene - neste, vi vil forenkle JSON:

{"id": 1, "itemName": "theItem", "createdBy": 2}

Når du ikke tar vare på dette til nøyaktig samme enheter - vil dette selvfølgelig mislykkes:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Ukjent felt "createdBy" (klasse org.baeldung.jackson.dtos.Item), ikke merket som uvitende (3 kjente egenskaper: "id", "eier", "itemName" ]) på [Kilde: [email protected]; linje: 1, kolonne: 43] (gjennom referansekjede: org.baeldung.jackson.dtos.Item ["createdBy"])

Vi løser dette ved å gjøre det vår egen deserialisering med en tilpasset Deserializer:

public class ItemDeserializer utvider StdDeserializer {public ItemDeserializer () {this (null); } offentlig ItemDeserializer (klasse vc) {super (vc); } @ Override public Item deserialize (JsonParser jp, DeserializationContext ctxt) kaster IOException, JsonProcessingException {JsonNode node = jp.getCodec (). ReadTree (jp); int id = (Heltall) ((IntNode) node.get ("id")). numberValue (); Streng elementnavn = node.get ("varenavn"). Som tekst (); int userId = (Integer) ((IntNode) node.get ("createdBy")). numberValue (); returner nytt element (id, itemName, new User (userId, null)); }}

Som du kan se, arbeider deserializer med standard Jackson-representasjon av JSON - the JsonNode. Når inngangen JSON er representert som en JsonNode, kan vi nå trekke ut relevant informasjon fra den og konstruere våre egne Punkt enhet.

Enkelt sagt, vi trenger det registrer denne egendefinerte deserialisereren og bare deserialiser JSON normalt:

ObjectMapper mapper = ny ObjectMapper (); SimpleModule-modul = ny SimpleModule (); module.addDeserializer (Item.class, new ItemDeserializer ()); mapper.registerModule (modul); Vare readValue = mapper.readValue (json, Item.class);

4. Tilpasset deserializer på klassen

Alternativt kan vi også registrer deserializer direkte på klassen:

@JsonDeserialize (ved hjelp av = ItemDeserializer.class) public class Item {...}

Med deserializer definert på klassenivå, er det ikke nødvendig å registrere den på ObjectMapper - en standard kartlegger vil fungere bra:

Item itemWithOwner = new ObjectMapper (). ReadValue (json, Item.class);

Denne typen konfigurasjon per klasse er veldig nyttig i situasjoner der vi kanskje ikke har direkte tilgang til råvaren ObjectMapper å konfigurere.

5. Konklusjon

Denne artikkelen viser hvordan du kan utnytte Jackson 2 til les ikke-standard JSON-inngang - og hvordan du kan kartlegge inngangen til en hvilken som helst Java-entitetsgraf med full kontroll over kartleggingen.

Implementeringen av alle disse eksemplene og kodebiter kan du finne i over på GitHub - det er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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