Kartizirajte serializaciju i deserijalizaciju s Jacksonom

1. Pregled

U ovom ćemo članku pogledati serializacija i deserializacija Java karata pomoću Jacksona.

Ilustrirat ćemo kako serializirati i deserializirati Karta, Karta, i Karta u i iz formata JSON Žice.

2. Konfiguracija Maven

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Najnoviju verziju Jacksona možete dobiti ovdje.

3. Serijalizacija

Serijalizacija pretvara Java objekt u tok bajtova, koji se može trajati ili dijeliti po potrebi. Java Karte su zbirke koje mapiraju ključ Objekt na vrijednost Objekt i često su najmanje intuitivni objekti za serializaciju.

3.1. Karta Serijalizacija

Za jednostavni slučaj, izradimo a Karta i serializirajte ga u JSON:

Karta karte = novi HashMap (); map.put ("ključ", "vrijednost"); Mapa ObjectMapper = novi ObjectMapper (); Niz jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (karta);

ObjectMapper je Jacksonov map za serializaciju, koji nam omogućuje da serializiramo svoj karta i napišite ga kao prilično otisnuti JSON Niz, koristiti toString () metoda u Niz:

{"key": "value"}

3.2. Karta Serijalizacija

Kartu koja sadrži prilagođenu Java klasu možete serializirati s nekoliko dodatnih koraka. Stvorimo a MyPair razreda predstavljati par srodnih Niz predmeta.

Napomena: geteri / postavljači trebali bi biti javni, a mi napominjemo toString () s @JsonValue kako bi osigurao da Jackson koristi ovaj običaj toString () prilikom serializacije:

javna klasa MyPair {prvo privatni niz; privatni niz drugi; @Override @JsonValue javni niz toString () {return first + "i" + second; } // standardni getter, postavljači, jednakosti, hashCode, konstruktori}

Ajmo sada reći Jacksonu kako se serirati MyPair produženjem Jacksonovog JsonSerializer:

javna klasa MyPairSerializer proširuje JsonSerializer {private ObjectMapper mapper = new ObjectMapper (); @Override public void serialize (MyPair value, JsonGenerator gen, SerializerProvider serializers) baca IOException, JsonProcessingException {StringWriter Writer = new StringWriter (); mapper.writeValue (pisac, vrijednost); gen.writeFieldName (writer.toString ()); }}

JsonSerializer, kao što i samo ime govori, serializira se MyPair u JSON koristeći MyPair‘S toString () metoda. Jackson nudi mnoštvo klasa serilizatora koji odgovaraju vašim zahtjevima za serializaciju.

Prijavite se MyPairSerializer našem Karta s @JsonSerialize bilješka. Imajte na umu da smo Jacksonu rekli samo kako da se serijalizira MyPair jer već zna kako se serirati Niz:

@JsonSerialize (keyUsing = MyPairSerializer.class) Karta karte;

Isprobajmo serializaciju naše karte:

karta = nova HashMap (); MyPair ključ = novi MyPair ("Abbott", "Costello"); map.put (ključ, "Komedija"); Niz jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (karta);

Serijalizirani JSON izlaz je:

{"Abbott i Costello": "Komedija"}

3.3. Karta Serijalizacija

Najsloženiji slučaj je serializacija a Karta, ali većina posla već je gotova. Iskoristimo Jacksonovu MapSerializer za našu kartu i MyPairSerializer iz prethodnog odjeljka za ključeve i vrijednosti karte:

@JsonSerialize (keyUsing = MapSerializer.class) Karta karte; @JsonSerialize (keyUsing = MyPairSerializer.class) MyPair mapKey; @JsonSerialize (keyUsing = MyPairSerializer.class) MyPair mapValue;

Isprobajmo serializiranje našeg Karta:

mapKey = novi MyPair ("Abbott", "Costello"); mapValue = novi MyPair ("Komedija", "1940-te"); map.put (mapKey, mapValue); Niz jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (karta);

Serijalizirani JSON izlaz, koristeći MyPair‘S toString () metoda, je:

{"Abbott i Costello": "Komedija i 1940-te"}

4. Deserijalizacija

Deserijalizacija pretvara tok bajtova u Java objekt koji možemo koristiti u kodu. U ovom ćemo odjeljku deserijalizirati unos JSON-a u Kartas različitih potpisa.

4.1. Karta Deserijalizacija

Za jednostavni slučaj, uzmimo ulazni niz u JSON formatu i pretvorimo ga u Karta Java kolekcija:

Niz jsonInput = "{\" ključ \ ": \" vrijednost \ "}"; TypeReference typeRef = novi TypeReference() {}; Map map = mapper.readValue (jsonInput, typeRef);

Koristimo Jacksonovu ObjectMapper kao što smo učinili za serializaciju, koristeći readValue () za obradu unosa. Također, imajte na umu našu upotrebu Jacksona TypeReference, koji ćemo upotrijebiti u svim primjerima deserijalizacije kako bismo opisali vrstu našeg odredišta Karta. Ovdje je toString () prikaz naše karte:

{ključ = vrijednost}

4.2. Karta Deserijalizacija

Promijenimo sada svoj ulazni JSON i TypeReference našeg odredišta do Karta:

Niz jsonInput = "{\" Abbott i Costello \ ": \" Komedija \ "}"; TypeReference typeRef = novi TypeReference() {}; Map map = mapper.readValue (jsonInput, typeRef);

Moramo stvoriti konstruktor za MyPair to traje a Niz s oba elementa i raščlanjuje ih na MyPair elementi:

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

I toString () Od našeg Karta objekt je:

{Abbott i Costello = Komedija}

Postoji još jedna opcija za slučaj kada se deserializiramo u Java klasu koja sadrži Karta - Možemo se poslužiti Jacksonovim KeyDeserializer razred, jedna od mnogih klasa deserijalizacije koju Jackson nudi. Mi bilježimo svoje ClassWithAMap s @JsonCreator, @JsonProperty, i @JsonDeserialize:

javna klasa ClassWithAMap {@JsonProperty ("map") @JsonDeserialize (keyUsing = MyPairDeserializer.class) karta privatne mape; @JsonCreator public ClassWithAMap (karta karte) {this.map = map; } // izostavljeni javni geteri / postavljači}

Kažemo Jacksonu da deserializira Karta sadržan u ClassWithAMap, pa moramo produžiti KeyDeserializer kako bi opisali kako deserializirati ključ karte, a MyPair objekt, iz ulaza Niz:

javna klasa MyPairDeserializer proširuje KeyDeserializer {@Override public MyPair deserializeKey (String key, DeserializationContext ctxt) baca IOException, JsonProcessingException {return new MyPair (key); }}

Deserijalizaciju testiramo pomoću readValue:

Niz jsonInput = "{\" Abbott i Costello \ ": \" Komedija \ "}"; ClassWithAMap classWithMap = mapper.readValue (jsonInput, ClassWithAMap.class);

Opet, toString () metoda našeg ClassWithAMap's karta daje izlaz koji očekujemo:

{Abbott i Costello = Komedija}

4.3. Karta Deserijalizacija

Na kraju, promijenimo svoj ulazni JSON i TypeReference našeg odredišta do Karta:

Niz jsonInput = "{\" Abbott i Costello \ ": \" Komedija i četrdesete godine \ "}"; TypeReference typeRef = novi TypeReference() {}; Map map = mapper.readValue (jsonInput, typeRef);

I toString () Od našeg Karta objekt je:

{Abbott i Costello = Komedija i četrdesete godine}

5. Zaključak

U ovom smo brzom vodiču vidjeli kako serizirati i deserializirati Javu Karte u i iz žica oblikovanih u JSON-u.

Kao i uvijek, primjer iz ovog članka možete pogledati u spremištu GitHub.


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