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.


$config[zx-auto] not found$config[zx-overlay] not found