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.