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.