Kortserialisering og deserialisering med Jackson

1. Oversigt

I denne artikel vil vi se på serialisering og deserialisering af Java-kort ved hjælp af Jackson.

Vi illustrerer, hvordan man serialiserer og deserialiserer Kort, Kort, og Kort til og fra JSON-formateret Strenge.

2. Maven-konfiguration

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Du kan få den nyeste version af Jackson her.

3. Serialisering

Serialisering konverterer et Java-objekt til en strøm af bytes, som kan vedvares eller deles efter behov. Java Kort er samlinger, der kortlægger en nøgle Objekt til en værdi Objekt og er ofte de mindst intuitive objekter, der kan serieiseres.

3.1. Kort Serialisering

Lad os i det enkle tilfælde oprette en Kort og serialiser det til JSON:

Kortkort = nyt HashMap (); map.put ("nøgle", "værdi"); ObjectMapper-kortlægger = ny ObjectMapper (); String jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (kort);

ObjectMapper er Jacksons kortlægning af serialisering, som giver os mulighed for at serialisere vores kort og skriv det ud som en smukt trykt JSON Snor, bruger toString () metode i Snor:

{"key": "værdi"}

3.2. Kort Serialisering

Du kan serieisere et kort, der indeholder en brugerdefineret Java-klasse med et par ekstra trin. Lad os oprette en MyPair klasse til at repræsentere et par beslægtede Snor genstande.

Bemærk: getters / setterne skal være offentlige, og vi kommenterer toString () med @JsonValue for at sikre, at Jackson bruger denne skik toString () når du serierer:

offentlig klasse MyPair {privat streng først; privat streng anden; @ Override @ JsonValue offentlig String toString () {returner første + "og" + sekund; } // standard getter, setters, equals, hashCode, constructors}

Lad os nu fortælle Jackson, hvordan man serierer MyPair ved at udvide Jacksons JsonSerializer:

offentlig klasse MyPairSerializer udvider JsonSerializer {private ObjectMapper mapper = ny ObjectMapper (); @Override public void serialize (MyPair value, JsonGenerator gen, SerializerProvider serializers) kaster IOException, JsonProcessingException {StringWriter forfatter = ny StringWriter (); mapper.writeValue (forfatter, værdi); gen.writeFieldName (writer.toString ()); }}

JsonSerializer, som navnet antyder, serialiseres MyPair til JSON ved hjælp af MyPair'S toString () metode. Jackson tilbyder mange Serializer-klasser, der passer til dine serialiseringskrav.

Vi ansøger MyPairSerializer til vores Kort med @JsonSerialize kommentar. Bemærk, at vi kun har fortalt Jackson, hvordan man serierer MyPair fordi det allerede ved, hvordan man serierer Snor:

@JsonSerialize (keyUsing = MyPairSerializer.class) Kortkort;

Lad os teste vores kortserialisering:

kort = nyt HashMap (); MyPair-nøgle = ny MyPair ("Abbott", "Costello"); map.put (nøgle, "komedie"); Streng jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (kort);

Den serielle JSON-output er:

{"Abbott og Costello": "Komedie"}

3.3. Kort Serialisering

Den mest komplekse sag serierer en Kort, men det meste af arbejdet er allerede udført. Lad os bruge Jacksons MapSerializer til vores kort, og MyPairSerializer fra det forrige afsnit for kortets nøgle- og værdityper:

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

Lad os teste serierne på vores Kort:

mapKey = nyt MyPair ("Abbott", "Costello"); mapValue = ny MyPair ("komedie", "1940'erne"); map.put (mapKey, mapValue); Streng jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (kort);

Serialiseret JSON-output ved hjælp af MyPair'S toString () metode er:

{"Abbott og Costello": "Komedie og 1940'erne"}

4. Deserialisering

Deserialisering konverterer en strøm af bytes til et Java-objekt, som vi kan bruge i kode. I dette afsnit deserialiserer vi JSON-input til Korts af forskellige underskrifter.

4.1. Kort Deserialisering

Lad os i det enkle tilfælde tage en JSON-formateret inputstreng og konvertere den til en Kort Java-samling:

Streng jsonInput = "{\" nøgle \ ": \" værdi \ "}"; TypeReference typeRef = ny TypeReference() {}; Map map = mapper.readValue (jsonInput, typeRef);

Vi bruger Jacksons ObjectMapper som vi gjorde for serialisering ved hjælp af readValue () til at behandle input. Bemærk også vores brug af Jacksons TypeReference, som vi bruger i alle vores eksempler på deserialisering til at beskrive typen af ​​vores destination Kort. Her er toString () repræsentation af vores kort:

{nøgle = værdi}

4.2. Kort Deserialisering

Lad os nu ændre vores input JSON og TypeReference af vores destination til Kort:

String jsonInput = "{\" Abbott and Costello \ ": \" Comedy \ "}"; TypeReference typeRef = ny TypeReference() {}; Map map = mapper.readValue (jsonInput, typeRef);

Vi er nødt til at oprette en konstruktør til MyPair det tager en Snor med begge elementer og parser dem til MyPair elementer:

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

Og toString () af vores Kort objektet er:

{Abbott og Costello = komedie}

Der er en anden mulighed for sagen, når vi deserialiserer til en Java-klasse, der indeholder en Kort - vi kan bruge Jacksons KeyDeserializer klasse, en af ​​mange deserialiseringskurser, som Jackson tilbyder. Vi kommenterer vores ClassWithAMap med @JsonCreator, @JsonPropertyog @JsonDeserialize:

offentlig klasse ClassWithAMap {@JsonProperty ("kort") @JsonDeserialize (keyUsing = MyPairDeserializer.class) privat kortkort; @JsonCreator offentlig ClassWithAMap (kortkort) {this.map = map; } // offentlige getters / setters udeladt}

Vi beder Jackson om at deserialisere Kort indeholdt i ClassWithAMap, så vi er nødt til at udvide KeyDeserializer for at beskrive, hvordan man deserialiserer kortets nøgle, a MyPair objekt fra et input Snor:

offentlig klasse MyPairDeserializer udvider KeyDeserializer {@ Override public MyPair deserializeKey (String key, DeserializationContext ctxt) throw IOException, JsonProcessingException {return new MyPair (key); }}

Vi tester deserialisering ud ved hjælp af readValue:

String jsonInput = "{\" Abbott and Costello \ ": \" Comedy \ "}"; ClassWithAMap classWithMap = mapper.readValue (jsonInput, ClassWithAMap.class);

Igen, den toString () metode til vores ClassWithAMap's kort giver os den forventede output:

{Abbott og Costello = komedie}

4.3. Kort Deserialisering

Endelig, lad os ændre vores input JSON og TypeReference af vores destination til Kort:

String jsonInput = "{\" Abbott og Costello \ ": \" Komedie og 1940'erne \ "}"; TypeReference typeRef = ny TypeReference() {}; Map map = mapper.readValue (jsonInput, typeRef);

Og toString () af vores Kort objektet er:

{Abbott og Costello = komedie og 1940'erne}

5. Konklusion

I denne hurtige vejledning har vi set, hvordan man serialiserer og deserialiserer Java Kort til og fra JSON-formaterede strenge.

Som altid kan du tjekke eksemplet i denne artikel i GitHub-arkivet.