Početak korištenja prilagođene deserijalizacije u Jacksonu

1. Pregled

Ovaj će brzi vodič ilustrirati kako koristiti Jackson 2 za deserializaciju JSON-a pomoću a prilagođeni Deserializer.

Ako želite dublje kopati i učiti druge cool stvari koje možete raditi s Jacksonom 2 - krenite prema glavnom Jacksonovom vodiču.

2. Standardna deserijalizacija

Počnimo s definiranjem 2 entiteta i vidjet ćemo kako će Jackson deserijalizirati JSON predstavu tim entitetima bez ikakvog prilagođavanja:

javni razred korisnika {javni int id; naziv javnog niza; } predmet javne klase {public int id; public String itemName; javni korisnik; }

Sada, definirajmo JSON predstavu koju želimo deserializirati:

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

I na kraju, uklonimo ovaj JSON iz Java entiteta:

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

3. Prilagođeni deserijalizator uključen ObjectMapper

U prethodnom primjeru JSON predstavljanje savršeno se podudara s java entitetima - sljedeće ćemo pojednostaviti JSON:

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

Kada se ovo raščlanjiva s potpuno istim entitetima - to po defaultu naravno neće uspjeti:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Neprepoznato polje "createdBy" (klasa org.baeldung.jackson.dtos.Item), nije označeno kao zanemarivo (3 poznata svojstva: "id", "owner", "itemName" ]) na [Izvor: [e-mail zaštićen]; redak: 1, stupac: 43] (kroz referentni lanac: org.baeldung.jackson.dtos.Item ["createdBy"])

To ćemo riješiti radeći naša vlastita deserializacija s prilagođenim Deserializatorom:

javna klasa ItemDeserializer proširuje StdDeserializer {public ItemDeserializer () {this (null); } javni ItemDeserializer (klasa vc) {super (vc); } @Override public Item deserialize (JsonParser jp, DeserializationContext ctxt) baca IOException, JsonProcessingException {JsonNode node = jp.getCodec (). ReadTree (jp); int id = (Integer) ((IntNode) node.get ("id")). numberValue (); Niz itemName = node.get ("itemName"). AsText (); int userId = (Integer) ((IntNode) node.get ("createdBy")). numberValue (); vrati novu stavku (id, itemName, new User (userId, null)); }}

Kao što vidite, deserializator radi sa standardnom Jackson predstavom JSON-a JsonNode. Jednom kada je ulazni JSON predstavljen kao JsonNode, možemo sada iz njega izvući relevantne podatke i konstruiramo svoje Artikal entitet.

Jednostavno rečeno, moramo registrirajte ovaj prilagođeni deserijalizator i jednostavno deserijalizirajte JSON normalno:

Mapa ObjectMapper = novi ObjectMapper (); Modul SimpleModule = novi SimpleModule (); module.addDeserializer (Item.class, novi ItemDeserializer ()); mapper.registerModule (modul); Stavka readValue = mapper.readValue (json, Item.class);

4. Prilagođeni deserijalizator na klasi

Alternativno, možemo i registrirajte deserijalizator izravno na razredu:

@JsonDeserialize (koristeći = ItemDeserializer.class) Predmet javne klase {...}

S deserializatorom definiranim na razini klase, nema potrebe za registracijom na ObjectMapper - zadani mapper dobro će raditi:

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

Ova vrsta konfiguracije po klasi vrlo je korisna u situacijama u kojima možda nemamo izravan pristup sirovom obliku ObjectMapper za konfiguriranje.

5. Zaključak

Ovaj članak pokazuje kako iskoristiti Jackson 2 čitati nestandardni JSON ulaz - i kako mapirati taj ulaz na bilo koji graf java entiteta s potpunom kontrolom nad mapiranjem.

Implementacija svih ovih primjera i isječaka koda možete pronaći u preko na GitHubu - to je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti takav kakav jest.