Kom godt i gang med brugerdefineret deserialisering i Jackson

1. Oversigt

Denne hurtige vejledning illustrerer, hvordan man bruger Jackson 2 til at deserialisere JSON ved hjælp af en brugerdefineret Deserializer.

Hvis du vil grave dybere og lære andre seje ting, du kan gøre med Jackson 2 - gå videre til den vigtigste Jackson-tutorial.

2. Standard deserialisering

Lad os starte med at definere to enheder og se, hvordan Jackson vil deserialisere en JSON-repræsentation til disse enheder uden nogen tilpasning:

public class User {public int id; offentligt strengnavn; } public class Item {public int id; public String itemName; offentlig Bruger ejer; }

Lad os nu definere den JSON-repræsentation, vi vil deserialisere:

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

Og endelig, lad os afmontere denne JSON til Java-enheder:

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

3. Custom Deserializer aktiveret ObjectMapper

I det forrige eksempel matchede JSON-repræsentationen java-enhederne perfekt - næste vil vi forenkle JSON:

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

Når du afmonterer dette til nøjagtigt de samme enheder - som standard vil dette naturligvis mislykkes:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Ukendt felt "createdBy" (klasse org.baeldung.jackson.dtos.Item), ikke markeret som uvidende (3 kendte egenskaber: "id", "ejer", "itemName" ]) på [Kilde: [email protected]; linje: 1, kolonne: 43] (gennem referencekæde: org.baeldung.jackson.dtos.Item ["createdBy"])

Vi løser dette ved at gøre vores egen deserialisering med en brugerdefineret Deserializer:

public class ItemDeserializer udvider 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 = (Heltal) ((IntNode) node.get ("id")). numberValue (); String itemName = node.get ("itemName"). AsText (); int userId = (Heltal) ((IntNode) node.get ("createdBy")). numberValue (); returner nyt emne (id, varenavn, ny bruger (userId, null)); }}

Som du kan se, arbejder deserializer med standard Jackson-repræsentationen af ​​JSON - the JsonNode. Når input JSON er repræsenteret som en JsonNode, kan vi nu udtrække de relevante oplysninger derfra og konstruere vores egne Vare enhed.

Kort sagt, vi har brug for det registrer denne brugerdefinerede deserializer og deserialiser simpelthen JSON normalt:

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

4. Custom Deserializer på klassen

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

@JsonDeserialize (ved hjælp af = ItemDeserializer.class) public class Item {...}

Med deserializer defineret på klasseniveau er det ikke nødvendigt at registrere det på ObjectMapper - en standard kortlægger fungerer fint:

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

Denne type konfiguration pr. Klasse er meget nyttig i situationer, hvor vi måske ikke har direkte adgang til det rå ObjectMapper at konfigurere.

5. Konklusion

Denne artikel viser, hvordan man bruger Jackson 2 til læse ikke-standard JSON-input - og hvordan man kortlægger dette input til en hvilken som helst java-enhedsgraf med fuld kontrol over kortlægningen.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i over på GitHub - det er et Maven-baseret projekt, så det skal være let at importere og køre som det er.


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