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.