Első lépések az egyedi deserializációval Jackson-ban

1. Áttekintés

Ez a gyors bemutató bemutatja, hogyan lehet a Jackson 2-t használni a JSON deserializálásához az a használatával egyedi Deserializer.

Ha mélyebbre akarsz ásni és tanulni egyéb jó dolgokat tehetsz a Jackson 2-vel - folytassa a Jackson fő oktatóanyaggal.

2. Standard deserializáció

Kezdjük azzal, hogy definiálunk 2 entitást, és megnézzük, hogy Jackson hogyan deserializálja a JSON-reprezentációt ezekhez az entitásokhoz testreszabás nélkül:

public class Felhasználó {public int id; public String név; } public class Item {public int id; public String itemName; nyilvános Felhasználótulajdonos; }

Most definiáljuk a deszerializálni kívánt JSON-ábrázolást:

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

És végül bontsuk ki ezt a JSON-t a Java-entitásoknak:

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

3. Az egyéni deserializer be van kapcsolva ObjectMapper

Az előző példában a JSON reprezentáció tökéletesen megfelelt a java entitásoknak - ezután leegyszerűsítjük a JSON-t:

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

Ha ezt pontosan ugyanazokra az entitásokra bontja - alapértelmezés szerint ez természetesen meghiúsul:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Felismeretlen mező "createdBy" (class org.baeldung.jackson.dtos Item), nincs jelölve tudhatatlannak (3 ismert tulajdonság: "id", "owner", "itemName" ]) a [Forrás: [email protected]; sor: 1, oszlop: 43] (hivatkozási láncon keresztül: org.baeldung.jackson.dtos.Item ["createdBy"])

Megoldjuk ezt azáltal saját deserializációnkat egyedi Deserializer-rel:

public class ItemDeserializer kiterjeszti StdDeserializer {public ItemDeserializer () {this (null); } public ItemDeserializer (vc osztály) {super (vc); } @Orride public item deserialize (JsonParser jp, DeserializationContext ctxt) IOException, JsonProcessingException {JsonNode node = jp.getCodec (). ReadTree (jp); int id = (Egész) ((IntNode) csomópont.get ("id")). számValue (); String itemName = node.get ("itemName"). AsText (); int userId = (Egész szám) ((IntNode) csomópont.get ("createdBy")). számValue (); return new Item (id, itemName, new User (userId, null)); }}

Amint láthatja, a deszerializátor a JSON - a JsonNode. Miután a bemenet a JSON a-ként jelenik meg JsonNode, most megtehetjük vonja ki belőle a vonatkozó információkat és megalkotjuk a sajátunkat Tétel entitás.

Egyszerűen fogalmazva, meg kell regisztrálja ezt az egyedi deserializer-t és egyszerűen deserializálja a JSON-t normálisan:

ObjectMapper mapper = új ObjectMapper (); SimpleModule module = new SimpleModule (); module.addDeserializer (Item.class, új ItemDeserializer ()); mapper.registerModule (modul); Elem readValue = mapper.readValue (json, Item.class);

4. Custom Deserializer az osztályon

Alternatív megoldásként azt is megtehetjük regisztrálja a deserializátort közvetlenül az osztályon:

@JsonDeserialize (using = ItemDeserializer.class) public class Item {...}

Az osztály szinten definiált deserializálóval nem kell regisztrálni a ObjectMapper - az alapértelmezett térképkészítő jól fog működni:

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

Ez a fajta osztályonkénti konfiguráció nagyon hasznos olyan helyzetekben, amikor előfordulhat, hogy nincs közvetlen hozzáférésünk a nyershez ObjectMapper konfigurálásához.

5. Következtetés

Ez a cikk bemutatja, hogyan lehet kihasználni a Jackson 2-t olvassa el a nem szabványos JSON bemenetet - és hogyan lehet ezt a bemenetet feltérképezni bármely java entitásgráfba a leképezés teljes ellenőrzésével.

Mindezen példák és kódrészletek megvalósítása megtalálható a GitHub oldalán - ez egy Maven-alapú projekt, így könnyen importálhatónak és futtathatónak kell lennie.