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.