Breng serialisering en deserialisering in kaart met Jackson

1. Overzicht

In dit artikel zullen we kijken naar serialisatie en deserialisatie van Java-kaarten met Jackson.

We laten zien hoe u kunt serialiseren en deserialiseren Kaart, Kaart, en Kaart van en naar JSON-geformatteerd Snaren.

2. Maven-configuratie

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Je kunt de nieuwste versie van Jackson hier downloaden.

3. Serialisatie

Serialisatie zet een Java-object om in een stroom bytes, die indien nodig kan worden bewaard of gedeeld. Java Kaarten zijn verzamelingen die een sleutel in kaart brengen Voorwerp tot een waarde Voorwerp en zijn vaak de minst intuïtieve objecten om te serialiseren.

3.1. Kaart Serialisatie

Laten we voor het eenvoudige geval een Kaart en serialiseer het naar JSON:

Map map = nieuwe HashMap (); map.put ("sleutel", "waarde"); ObjectMapper-mapper = nieuwe ObjectMapper (); String jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (kaart);

ObjectMapper is Jackson's serialisatie-mapper, waarmee we onze kaart en schrijf het uit als een mooi gedrukte JSON Draad, de ... gebruiken toString () methode in Draad:

{ "sleutel waarde" }

3.2. Kaart Serialisatie

U kunt een kaart met een aangepaste Java-klasse serialiseren met een paar extra stappen. Laten we een MyPair klasse om een ​​paar verwante te vertegenwoordigen Draad voorwerpen.

Let op: de getters / setters moeten openbaar zijn, en we annoteren toString () met @JsonValue om ervoor te zorgen dat Jackson deze gewoonte gebruikt toString () bij het serialiseren:

openbare klasse MyPair {private String eerst; private String tweede; @Override @JsonValue public String toString () {return first + "en" + second; } // standard getter, setters, equals, hashCode, constructors}

Laten we Jackson nu vertellen hoe hij moet serialiseren MyPair door Jackson's uit te breiden JsonSerializer:

openbare klasse MyPairSerializer breidt JsonSerializer uit {private ObjectMapper mapper = new ObjectMapper (); @Override public void serialize (MyPair-waarde, JsonGenerator-gen, SerializerProvider-serializers) gooit IOException, JsonProcessingException {StringWriter-schrijver = nieuwe StringWriter (); mapper.writeValue (schrijver, waarde); gen.writeFieldName (writer.toString ()); }}

JsonSerializer, zoals de naam suggereert, serialiseert MyPair naar JSON met MyPair‘S toString () methode. Jackson biedt veel Serializer-klassen om aan uw serialisatievereisten te voldoen.

We zijn van toepassing MyPairSerializer naar onze Kaart met de @JsonSerialize annotatie. Merk op dat we Jackson alleen hebben verteld hoe hij moet serialiseren MyPair omdat het al weet hoe te serialiseren Draad:

@JsonSerialize (keyUsing = MyPairSerializer.class) Kaart kaart;

Laten we onze kaartserialisering testen:

map = nieuwe HashMap (); MyPair-sleutel = nieuwe MyPair ("Abbott", "Costello"); map.put (key, "Comedy"); String jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (kaart);

De geserialiseerde JSON-uitvoer is:

{"Abbott and Costello": "Comedy"}

3.3. Kaart Serialisatie

De meest complexe zaak is het serialiseren van een Kaart, maar het meeste werk is al gedaan. Laten we die van Jackson gebruiken MapSerializer voor onze kaart, en MyPairSerializer uit de vorige sectie voor de sleutel- en waardetypen van de kaart:

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

Laten we het serialiseren van onze Kaart:

mapKey = nieuwe MyPair ("Abbott", "Costello"); mapValue = nieuwe MyPair ("Comedy", "1940s"); map.put (mapKey, mapValue); String jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (kaart);

De geserialiseerde JSON-uitvoer, met behulp van MyPair‘S toString () methode, is:

{"Abbott and Costello": "Comedy and 1940s"}

4. Deserialisatie

Deserialisatie zet een stroom bytes om in een Java-object dat we in code kunnen gebruiken. In deze sectie zullen we JSON-invoer deserialiseren naar Kaarts van verschillende handtekeningen.

4.1. Kaart Deserialisatie

Laten we voor het eenvoudige geval een JSON-geformatteerde invoertekenreeks nemen en deze converteren naar een Kaart Java-collectie:

String jsonInput = "{\" key \ ": \" waarde \ "}"; TypeReference typeRef = nieuw TypeReference() {}; Kaart map = mapper.readValue (jsonInput, typeRef);

We gebruiken Jackson's ObjectMapper zoals we deden voor serialisatie, met behulp van readValue () om de invoer te verwerken. Let ook op ons gebruik van Jackson's TypeReference, die we zullen gebruiken in al onze deserialisatievoorbeelden, om het type van onze bestemming te beschrijven Kaart. Hier is de toString () weergave van onze kaart:

{key = waarde}

4.2. Kaart Deserialisatie

Laten we nu onze invoer JSON en het TypeReference van onze bestemming naar Kaart:

String jsonInput = "{\" Abbott en Costello \ ": \" Komedie \ "}"; TypeReference typeRef = nieuw TypeReference() {}; Kaart map = mapper.readValue (jsonInput, typeRef);

We moeten een constructor maken voor MyPair dat duurt een Draad met beide elementen en parseert ze naar de MyPair elementen:

openbare MyPair (String beide) {String [] paren = both.split ("en"); this.first = paren [0] .trim (); this.second = paren [1] .trim (); }

En de toString () van onze Kaart object is:

{Abbott en Costello = Comedy}

Er is een andere optie voor het geval dat we deserialiseren naar een Java-klasse die een Kaart - we kunnen Jackson's gebruiken KeyDeserializer klasse, een van de vele deserialisatieklassen die Jackson aanbiedt. We annoteren onze ClassWithAMap met @RTLnieuws, @JsonProperty, en @JsonDeserialize:

openbare klasse ClassWithAMap {@JsonProperty ("map") @JsonDeserialize (keyUsing = MyPairDeserializer.class) privé Map; @JsonCreator openbare ClassWithAMap (Map map) {this.map = map; } // openbare getters / setters weggelaten}

We vertellen Jackson dat hij het Kaart Verpakt in ClassWithAMap, dus we moeten uitbreiden KeyDeserializer om te beschrijven hoe u de sleutel van de kaart deserialiseert, a MyPair object, van een input Draad:

openbare klasse MyPairDeserializer breidt KeyDeserializer uit {@Override openbare MyPair deserializeKey (String key, DeserializationContext ctxt) gooit IOException, JsonProcessingException {return new MyPair (key); }}

We testen de deserialisatie uit met readValue:

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

Nogmaals, de toString () methode van onze ClassWithAMap's map geeft ons de output die we verwachten:

{Abbott en Costello = Comedy}

4.3. Kaart Deserialisatie

Laten we ten slotte onze invoer JSON en het TypeReference van onze bestemming naar Kaart:

String jsonInput = "{\" Abbott en Costello \ ": \" Komedie en jaren 40 \ "}"; TypeReference typeRef = nieuw TypeReference() {}; Kaart map = mapper.readValue (jsonInput, typeRef);

En de toString () van onze Kaart object is:

{Abbott and Costello = Comedy and 1940}

5. Conclusie

In deze korte handleiding hebben we gezien hoe u Java kunt serialiseren en deserialiseren Kaarten van en naar JSON-geformatteerde strings.

Zoals altijd kun je het voorbeeld in dit artikel bekijken in de GitHub-repository.