Térképszerializálás és deserializáció Jackson-szal

1. Áttekintés

Ebben a cikkben megnézzük Java térképek sorosítása és deserializálása Jackson segítségével.

Ábrázoljuk, hogyan lehet sorosítani és deserializálni Térkép, Térkép, és Térkép JSON-formátumba és onnan Húrok.

2. Maven konfiguráció

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Jackson legújabb verzióját itt szerezheti be.

3. Sorosítás

A szerializálás egy Java objektumot bájtfolyamokká alakít át, amelyet szükség esetén meg lehet tartani vagy meg lehet osztani. Jáva Térképek olyan gyűjtemények, amelyek kulcsot térképeznek fel Tárgy értékre Tárgy és gyakran a legkevésbé intuitív tárgyak a sorosításhoz.

3.1. Térkép Serializálás

Az egyszerű esethez hozzunk létre egy Térkép és sorosítsa a JSON-hoz:

Térképtérkép = új HashMap (); map.put ("kulcs", "érték"); ObjectMapper mapper = új ObjectMapper (); Karakterlánc jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (térkép);

ObjectMapper Jackson sorosítási leképezője, amely lehetővé teszi számunkra, hogy sorosítsuk térkép és szép nyomtatott JSON-ként írja ki Húr, használni a toString () módszer ben Húr:

{ "kulcs érték" }

3.2. Térkép Serializálás

Néhány további lépéssel sorosíthatja az egyedi Java osztályt tartalmazó térképet. Hozzunk létre egy MyPair osztály egy rokon pár képviseletére Húr tárgyakat.

Megjegyzés: a gettereknek / beállítóknak nyilvánosaknak kell lenniük, és mi jegyzetekkel ellátjuk toString () val vel @JsonValue hogy Jackson ezt a szokást használja toString () sorozatosításkor:

nyilvános osztály MyPair {private String first; privát String második; @Orride @JsonValue public String toString () {return first + "and" + second; } // standard getter, beállítók, egyenlő, hashCode, konstruktorok}

Most mondjuk meg Jacksonnak, hogyan kell sorosítani MyPair kibővítve Jacksonét JsonSerializer:

public class A MyPairSerializer kiterjeszti a JsonSerializer {private ObjectMapper mapper = new ObjectMapper (); @Orride public void serialize (MyPair value, JsonGenerator gen, SerializerProvider serializer) IOException, JsonProcessingException {StringWriter író = új StringWriter (); mapper.writeValue (író, érték); gen.writeFieldName (író.String ()); }}

JsonSerializer, ahogy a neve is sugallja, sorozatos MyPair hogy JSON segítségével MyPair’S toString () módszer. Jackson számos Serializer osztályt kínál, hogy megfeleljen a szerializációs követelményeknek.

Jelentkezünk MyPairSerializer a miénknek Térkép a ... val @JsonSerialize annotáció. Ne feledje, hogy csak Jacksonnak mondtuk el, hogyan kell sorosítani MyPair mert már tudja, hogyan kell sorosítani Húr:

@JsonSerialize (keyUsing = MyPairSerializer.class) Térképtérkép;

Teszteljük a térkép sorozatozásunkat:

térkép = új HashMap (); MyPair kulcs = új MyPair ("Abbott", "Costello"); map.put (kulcs, "Comedy"); Karakterlánc jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (térkép);

A sorosított JSON kimenet:

{"Abbott és Costello": "Vígjáték"}

3.3. Térkép Serializálás

A legösszetettebb eset az a Térkép, de a munka nagy része már elkészült. Használjuk Jacksonét MapSerializer a térképünkhöz, és MyPairSerializer az előző szakaszból a térkép kulcs- és értéktípusaihoz:

@JsonSerialize (keyUsing = MapSerializer.class) Térképtérkép; @JsonSerialize (keyUsing = MyPairSerializer.class) MyPair mapKey; @JsonSerialize (keyUsing = MyPairSerializer.class) MyPair mapValue;

Próbáljuk ki a mi sorozatunkat Térkép:

mapKey = new MyPair ("Abbott", "Costello"); mapValue = new MyPair ("Vígjáték", "1940-es évek"); map.put (mapKey, mapValue); Karakterlánc jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (térkép);

A sorosított JSON kimenet, a MyPair’S toString () módszer:

{"Abbott és Costello": "Vígjáték és 1940-es évek"}

4. Deserializáció

A deserializáció a bájtfolyamot Java objektummá alakítja, amelyet kódban használhatunk. Ebben a szakaszban deszerializáljuk a JSON bemenetét Térképs különböző aláírások.

4.1. Térkép Deserializáció

Az egyszerű esethez vegyünk egy JSON-formátumú bemeneti karakterláncot, és alakítsuk át a-vá Térkép Java gyűjtemény:

Karakterlánc jsonInput = "{\" kulcs \ ": \" érték \ "}"; TypeReference typeRef = new TypeReference() {}; Térképtérkép = mapper.readValue (jsonInput, typeRef);

Jacksonét használjuk ObjectMapper mint a sorosításhoz, a readValue () a bemenet feldolgozásához. Vegye figyelembe a Jackson használatát is TypeReference, amelyet minden deserializációs példánkban felhasználunk, hogy leírjuk a rendeltetési hely típusát Térkép. Itt van toString () térképünk ábrázolása:

{kulcs = érték}

4.2. Térkép Deserializáció

Most változtassuk meg a JSON és a TypeReference célunk felé Térkép:

Karakterlánc jsonInput = "{\" Abbott és Costello \ ": \" Vígjáték \ "}"; TypeReference typeRef = új TypeReference() {}; Térképtérkép = mapper.readValue (jsonInput, typeRef);

Ehhez létre kell hoznunk egy konstruktort MyPair hogy a Húr mindkét elemmel és elemzi őket a MyPair elemek:

public MyPair (String both) {String [] pár = mindkettő.split ("és"); ez.első = párok [0] .trim (); ez.második = párok [1] .trim (); }

És a toString () a mi Térkép objektum:

{Abbott és Costello = vígjáték}

Van egy másik lehetőség arra az esetre, amikor deszerializálódunk egy Java osztályba, amely a-t tartalmaz Térkép - használhatjuk Jacksonét KeyDeserializer osztály, a Jackson által kínált számos deserializációs osztály egyike. Megjegyezzük a mi ClassWithAMap val vel @JsonCreator, @JsonProperty, és @JsonDeserialize:

public class ClassWithAMap {@JsonProperty ("map") @JsonDeserialize (keyUsing = MyPairDeserializer.class) privát Térképtérkép; @JsonCreator public ClassWithAMap (Térképtérkép) {this.map = térkép; } // nyilvános getterek / beállítók kihagyva}

Azt mondjuk Jacksonnak, hogy deserializálja a Térkép tartalmazza ClassWithAMap, ezért ki kell terjesztenünk KeyDeserializer a térkép kulcsának deserializálásának leírása, a MyPair objektum, egy bemenetből Húr:

public class MyPairDeserializer kiterjeszti a KeyDeserializer {@Override public MyPair deserializeKey (String kulcs, DeserializationContext ctxt) dobja az IOException, JsonProcessingException {return new MyPair (kulcs); }}

A deserializációt a segítségével teszteljük readValue:

Karakterlánc jsonInput = "{\" Abbott és Costello \ ": \" Vígjáték \ "}"; ClassWithAMap classWithMap = mapper.readValue (jsonInput, ClassWithAMap.class);

Ismét a toString () módszerünk ClassWithAMap's A térkép megadja a várt eredményt:

{Abbott és Costello = vígjáték}

4.3. Térkép Deserializáció

Végül változtassunk a JSON és a TypeReference célunk felé Térkép:

Karakterlánc jsonInput = "{\" Abbott és Costello \ ": \" Vígjáték és 1940-es évek ""; TypeReference typeRef = új TypeReference() {}; Térképtérkép = mapper.readValue (jsonInput, typeRef);

És a toString () a mi Térkép objektum:

{Abbott és Costello = Vígjáték és 1940-es évek}

5. Következtetés

Ebben a gyors oktatóanyagban láthattuk, hogyan lehet sorosítani és deserializálni a Java-t Térképek JSON-formátumú karakterláncokra és onnan.

Mint mindig, itt is megnézheti a cikkben található példát a GitHub-tárházban.