Serializácia a deserializácia mapy s Jacksonom

1. Prehľad

V tomto článku sa pozrieme na serializácia a deserializácia máp Java pomocou Jacksona.

Ukážeme si, ako serializovať a deserializovať Mapa, Mapa, a Mapa do a zo formátu JSON Struny.

2. Konfigurácia Maven

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Najnovšiu verziu Jacksona nájdete tu.

3. Serializácia

Serializácia prevádza objekt Java na prúd bajtov, ktorý je možné podľa potreby pretrvávať alebo zdieľať. Java Mapy sú zbierky, ktoré mapujú kľúč Objekt na hodnotu Objekt a sú často najmenej intuitívne objekty na serializáciu.

3.1. Mapa Serializácia

Pre jednoduchý prípad vytvoríme a Mapa a serializujte ho do formátu JSON:

Mapová mapa = nová HashMap (); map.put ("kľúč", "hodnota"); ObjectMapper mapovač = nový ObjectMapper (); Reťazec jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (mapa);

ObjectMapper je Jacksonov mapovač serializácie, ktorý nám umožňuje serializovať náš mapa a napíš to ako pekne vytlačený súbor JSON Stringpomocou natiahnuť() metóda v String:

{"key": "value"}

3.2. Mapa Serializácia

Mapu obsahujúcu vlastnú triedu Java môžete serializovať pomocou niekoľkých ďalších krokov. Vytvorme a MyPair triedy predstavovať dvojicu príbuzných String predmety.

Poznámka: vyhlasovatelia / zakladatelia by mali byť verejní a anotujeme natiahnuť() s @JsonValue aby sa zabezpečilo, že Jackson použije tento zvyk natiahnuť() pri serializácii:

verejná trieda MyPair {najskôr súkromný reťazec; privátny druhý reťazec; @Override @JsonValue public String toString () {návrat prvý + "a" + druhý; } // štandardný geter, nastavovač, rovná sa, hashCode, konštruktory}

Poďme teraz povedať Jacksonovi, ako serializovať MyPair predĺžením Jacksonovej JsonSerializer:

verejná trieda MyPairSerializer rozširuje JsonSerializer {súkromný mapovač ObjectMapper = nový ObjectMapper (); @Override public void serialize (hodnota MyPair, JsonGenerator gen, SerializerProvider serializers) hodí IOException, JsonProcessingException {StringWriter writer = new StringWriter (); mapper.writeValue (zapisovač, hodnota); gen.writeFieldName (writer.toString ()); }}

JsonSerializer, ako už názov napovedá, serializuje MyPair pomocou JSON MyPair‘S natiahnuť() metóda. Jackson poskytuje mnoho tried Serializer, aby vyhovoval vašim požiadavkám na serializáciu.

Podávame žiadosť MyPairSerializer k nášmu Mapa s @JsonSerialize anotácia. Upozorňujeme, že Jacksonovi sme povedali iba to, ako serializovať MyPair pretože už vie, ako serializovať Reťazec:

@JsonSerialize (keyUsing = MyPairSerializer.class) Mapa mapy;

Vyskúšajme našu serializáciu máp:

mapa = nová HashMap (); Kľúč MyPair = nový MyPair ("Abbott", "Costello"); map.put (kľúč, „Komédia“); Reťazec jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (mapa);

Serializovaný výstup JSON je:

{"Abbott a Costello": "Komédia"}

3.3. Mapa Serializácia

Najzložitejším prípadom je serializácia a Mapa, ale väčšina práce je už hotová. Použime Jacksonove MapSerializer pre našu mapu a MyPairSerializer z predchádzajúcej časti pre typy kľúčov a hodnôt mapy:

@JsonSerialize (keyUsing = MapSerializer.class) Mapa mapy; @JsonSerialize (keyUsing = MyPairSerializer.class) MyPair mapKey; @JsonSerialize (keyUsing = MyPairSerializer.class) MyPair mapValue;

Poďme vyskúšať náš serializáciu Mapa:

mapKey = nový MyPair ("Abbott", "Costello"); mapValue = nový MyPair („Komédia“, 40. roky 20. storočia); map.put (mapKey, mapValue); Reťazec jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (mapa);

Serializovaný výstup JSON pomocou MyPair‘S natiahnuť() metóda je:

{"Abbott a Costello": "Komédia a 40. roky 20. storočia"}

4. Deserializácia

Deserializácia prevádza prúd bajtov na objekt Java, ktorý môžeme použiť v kóde. V tejto časti vykonáme deserializáciu vstupu JSON Mapas rôznych podpisov.

4.1. Mapa Deserializácia

Pre jednoduchý prípad si vezmeme vstupný reťazec vo formáte JSON a prevedieme ho na a Mapa Zbierka Java:

Reťazec jsonInput = "{\" kľúč \ ": \" hodnota \ "}"; TypeReference typeRef = nový TypeReference() {}; Mapa mapa = mapper.readValue (jsonInput, typeRef);

Používame Jacksonove ObjectMapper ako sme to urobili pri serializácii pomocou readValue () spracovať vstup. Tiež si všimnite naše použitie Jacksonových TypeReference, ktoré použijeme vo všetkých našich príkladoch deserializácie, na opísanie typu nášho cieľa Mapa. Tu je natiahnuť() znázornenie našej mapy:

{key = value}

4.2. Mapa Deserializácia

Teraz poďme zmeniť náš vstupný JSON a TypeReference nášho cieľa do Mapa:

Reťazec jsonInput = "{\" Abbott a Costello \ ": \" Komédia \ "}"; TypeReference typeRef = nový TypeReference() {}; Mapa mapa = mapper.readValue (jsonInput, typeRef);

Musíme vytvoriť konštruktor pre MyPair to trvá a String s oboma prvkami a analyzuje ich na MyPair prvky:

public MyPair (String both) {String [] pair = both.split ("and"); this.first = pair [0] .trim (); this.second = pair [1] .trim (); }

A natiahnuť() nášho Mapa objekt je:

{Abbott a Costello = komédia}

Existuje ďalšia možnosť pre prípad, keď deserializujeme do triedy Java, ktorá obsahuje a Mapa - môžeme použiť Jacksona KeyDeserializer trieda, jedna z mnohých tried deserializácie, ktoré Jackson ponúka. Anotujeme naše ClassWithAMap s @JsonCreator, @JsonPropertya @JsonDeserialize:

verejná trieda ClassWithAMap {@JsonProperty ("mapa") @JsonDeserialize (keyUsing = MyPairDeserializer.class) súkromná mapa mapy; @JsonCreator public ClassWithAMap (mapa mapy) {this.map = mapa; } // vynechaní verejní zakladatelia / zakladatelia}

Hovoríme Jacksonovi, aby deserializoval Mapa obsiahnuté v ClassWithAMap, takže musíme predĺžiť KeyDeserializer popísať, ako deserializovať kľúč na mape, a MyPair objektu zo vstupu String:

public class MyPairDeserializer extends KeyDeserializer {@Override public MyPair deserializeKey (String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {return new MyPair (key); }}

Testujeme deserializáciu pomocou readValue:

Reťazec jsonInput = "{\" Abbott a Costello \ ": \" Komédia \ "}"; ClassWithAMap classWithMap = mapper.readValue (jsonInput, ClassWithAMap.class);

Opäť platí, že natiahnuť() metóda našej ClassWithAMap mapa nám dáva výstup, ktorý očakávame:

{Abbott a Costello = komédia}

4.3. Mapa Deserializácia

Na záver zmeňme náš vstupný JSON a TypeReference nášho cieľa do Mapa:

Reťazec jsonInput = "{\" Abbott a Costello \ ": \" Komédia a 40. roky 20. storočia \ "}"; TypeReference typeRef = nový TypeReference() {}; Mapa mapa = mapper.readValue (jsonInput, typeRef);

A natiahnuť() nášho Mapa objekt je:

{Abbott a Costello = komédia a 40. roky 20. storočia}

5. Záver

V tomto rýchlom výučbe sme videli, ako serializovať a deserializovať Javu Mapy do a z reťazcov vo formáte JSON.

Ako vždy, môžete si pozrieť príklad uvedený v tomto článku v úložisku GitHub.


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