Začíname s vlastnou deserializáciou v Jackson
1. Prehľad
Tento rýchly návod ilustruje, ako používať Jackson 2 na deserializáciu súboru JSON pomocou a vlastný deserializátor.
Ak chcete kopať hlbšie a učiť sa ďalšie super veci, ktoré môžete s Jacksonom 2 robiť - pokračujte ďalej k hlavnému výukovému programu Jackson.
2. Štandardná deserializácia
Začnime definovaním 2 entít a uvidíme, ako Jackson deserializuje reprezentáciu JSON na tieto entity bez akýchkoľvek úprav:
public class User {public int id; verejné meno reťazca; } public class Item {public int id; public String itemName; verejný vlastník používateľa; }
Teraz definujme reprezentáciu JSON, ktorú chceme deserializovať:
{"id": 1, "itemName": "theItem", "owner": {"id": 2, "name": "theUser"}}
A na záver oddeľme tento JSON od entít Java:
Položka itemWithOwner = nový ObjectMapper (). ReadValue (json, Item.class);
3. Vlastný deserializér zapnutý ObjectMapper
V predchádzajúcom príklade sa reprezentácia JSON dokonale zhodovala s entitami Java - ďalej zjednodušíme JSON:
{"id": 1, "itemName": "theItem", "createdBy": 2}
Keď ich rozdelíte do úplne rovnakých entít - predvolene to samozrejme zlyhá:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Nerozpoznané pole „createdBy“ (trieda org.baeldung.jackson.dtos.Item), ktoré nie je označené ako ignorovateľné (3 známe vlastnosti: „id“, „vlastník“, „itemName“) ]) na [Zdroj: [chránený e-mailom]; riadok: 1, stĺpec: 43] (prostredníctvom referenčného reťazca: org.baeldung.jackson.dtos.Item ["createdBy"])
Vyriešime to tak, že urobíme naša vlastná deserializácia pomocou vlastného deserializátora:
verejná trieda ItemDeserializer rozširuje StdDeserializer {public ItemDeserializer () {this (null); } public ItemDeserializer (trieda vc) {super (vc); } @Override public Item deserialize (JsonParser jp, DeserializationContext ctxt) vyvolá IOException, JsonProcessingException {JsonNode node = jp.getCodec (). ReadTree (jp); int id = (Integer) ((IntNode) node.get ("id")). numberValue (); Reťazec itemName = node.get ("itemName"). AsText (); int userId = (Integer) ((IntNode) node.get ("createdBy")). numberValue (); vrátiť novú položku (id, itemName, new User (userId, null)); }}
Ako vidíte, deserializátor pracuje so štandardným Jacksonovým znázornením JSON - JsonNode. Akonáhle je vstupný JSON reprezentovaný ako a JsonNode, môžeme teraz extrahovať z neho príslušné informácie a postaviť si vlastné Položka subjekt.
Jednoducho povedané, musíme zaregistrujte tento vlastný deserializátor a jednoducho deserializujte JSON normálne:
ObjectMapper mapovač = nový ObjectMapper (); Modul SimpleModule = nový SimpleModule (); module.addDeserializer (Item.class, nový ItemDeserializer ()); mapper.registerModule (modul); Položka readValue = mapper.readValue (json, Item.class);
4. Vlastný deserializátor v triede
Prípadne môžeme tiež zaregistrujte deserializátor priamo v triede:
@JsonDeserialize (using = ItemDeserializer.class) verejná trieda Item {...}
S deserializátorom definovaným na úrovni triedy nie je potrebné ho registrovať na serveri ObjectMapper - predvolený mapovač bude fungovať dobre:
Položka itemWithOwner = nový ObjectMapper (). ReadValue (json, Item.class);
Tento typ konfigurácie pre každú triedu je veľmi užitočný v situáciách, keď nemusíme mať priamy prístup k raw ObjectMapper nakonfigurovať.
5. Záver
Tento článok ukazuje, ako využiť Jackson 2 na prečítať neštandardný vstup JSON - a ako mapovať tento vstup na akýkoľvek graf entity Java s plnou kontrolou nad mapovaním.
Implementácia všetkých týchto príkladov a útržkov kódu nájdete viac na GitHub - je to projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.