Mapovanie dynamického objektu JSON s Jacksonom

1. Úvod

Práca s preddefinovanými dátovými štruktúrami JSON s Jacksonom je jednoduchá. Niekedy však musíme zvládnuť dynamiku Objekty JSON, ktoré majú neznáme vlastnosti.

V tomto krátkom tutoriáli uvidíme niekoľko spôsobov mapovania dynamických objektov JSON do tried Java.

Všimnite si, že vo všetkých testoch predpokladáme, že máme pole objectMapper typu com.fasterxml.jackson.databind.ObjectMapper.

2. Pomocou JsonNode

Povedzme, že chceme spracovať špecifikácie produktu vo webovom obchode. Všetky produkty majú niektoré spoločné vlastnosti, existujú však aj ďalšie, ktoré závisia od typu produktu.

Napríklad by sme chceli poznať pomer strán displeja mobilného telefónu, ale táto vlastnosť nedáva príliš zmysel pre topánku.

Dátová štruktúra vyzerá takto:

{"name": "Pear yPhone 72", "category": "mobil", "details": {"displayAspectRatio": "97: 3", "audioConnector": "none"}}

Dynamické vlastnosti ukladáme do podrobnosti objekt.

Spoločné vlastnosti môžeme mapovať pomocou nasledujúcej triedy Java:

trieda Produkt {Názov reťazca; Kategória strún; // štandardné getre a setre}

Okrem toho potrebujeme zodpovedajúce zastúpenie pre podrobnosti objekt. Napríklad, com.fasterxml.jackson.databind.JsonNode zvláda dynamické klávesy.

Aby sme ju mohli použiť, musíme ju pridať ako pole do našej Výrobok trieda:

trieda Produkt {// spoločné polia Podrobnosti JsonNode; // štandardné getre a setre}

Nakoniec overíme, že to funguje:

Reťazec json = ""; Produkt product = objectMapper.readValue (json, Product.class); assertThat (product.getName ()). isEqualTo ("Hruška yPhone 72"); assertThat (product.getDetails (). get ("audioConnector"). asText ()). isEqualTo ("none");

S týmto riešením však máme problém. Naša trieda závisí od Jacksonovej knižnice, pretože máme JsonNode lúka.

3. Používanie Mapa

Tento problém môžeme vyriešiť použitím java.util.Map pre podrobnosti lúka. Presnejšie, musíme použiť Mapa.

Všetko ostatné môže zostať rovnaké:

trieda Produkt {// bežné polia Podrobnosti mapy; // štandardné getre a setre}

A potom to môžeme overiť testom:

Reťazec json = ""; Produkt product = objectMapper.readValue (json, Product.class); assertThat (product.getName ()). isEqualTo ("Hruška yPhone 72"); assertThat (product.getDetails (). get ("audioConnector")). isEqualTo ("none");

4. Používanie @JsonAnySetter

Predchádzajúce riešenia sú dobré, keď objekt obsahuje iba dynamické vlastnosti. Niekedy však máme pevné a dynamické vlastnosti zmiešané v jednom objekte JSON.

Možno budeme musieť sploštiť naše zastúpenie produktov:

{"name": "Pear yPhone 72", "category": "mobil", "displayAspectRatio": "97: 3", "audioConnector": "none"}

S touto štruktúrou môžeme zaobchádzať ako s dynamickým objektom. To, bohužiaľ, znamená, že nemôžeme definovať spoločné vlastnosti - musíme s nimi tiež zaobchádzať dynamicky.

Prípadne môžeme použiť @JsonAnySetter na označenie metódy pre manipuláciu s ďalšími, neznámymi vlastnosťami. Takáto metóda by mala akceptovať dva argumenty: názov a hodnotu vlastnosti:

trieda Produkt {// bežné polia Podrobnosti mapy = nový LinkedHashMap (); @JsonAnySetter void setDetail (reťazcový kľúč, hodnota objektu) {details.put (kľúč, hodnota); } // štandardní zakladatelia a zakladatelia}

Upozorňujeme, že musíme vytvoriť inštanciu podrobnosti objekt, ktorému sa treba vyhnúť NullPointerExceptions.

Pretože ukladáme dynamické vlastnosti do a Mapa, môžeme ho použiť rovnako ako predtým:

Reťazec json = ""; Produkt product = objectMapper.readValue (json, Product.class); assertThat (product.getName ()). isEqualTo ("Hruška yPhone 72"); assertThat (product.getDetails (). get ("audioConnector")). isEqualTo ("none");

5. Vytvorenie vlastného deserializátora

Vo väčšine prípadov tieto riešenia fungujú dobre. Niekedy však potrebujeme oveľa väčšiu kontrolu. Napríklad by sme mohli uložiť informácie o deserializácii našich objektov JSON do databázy.

Na tieto situácie môžeme zamerať vlastný deserializátor. Pretože je to komplexná téma, venujeme sa jej v inom článku, Začíname s Custom Deserialization v Jackson.

6. Záver

V tomto článku sme videli viac spôsobov spracovania dynamických objektov JSON s Jacksonom.

Ako obvykle sú príklady k dispozícii na GitHub.


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