Peta Serialisasi dan Deserialisasi dengan Jackson

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat serialisasi dan deserialisasi peta Java menggunakan Jackson .

Kami akan menerangkan bagaimana untuk membuat siri dan deserialisasi Peta , Peta, dan Peta ke dan dari String berformat JSON .

2. Konfigurasi Maven

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Anda boleh mendapatkan versi terbaru Jackson di sini.

3. Serialisasi

Serialisasi mengubah objek Java menjadi aliran byte, yang dapat ditahan atau dibagikan sesuai keperluan. Peta Java adalah koleksi yang memetakan Objek utama ke Objek nilai dan sering merupakan objek yang paling intuitif untuk bersiri.

3.1. Serialisasi Peta

Untuk kes mudahnya, mari buat Peta dan sirikannya ke JSON:

Map map = new HashMap(); map.put("key", "value"); ObjectMapper mapper = new ObjectMapper(); String jsonResult = mapper.writerWithDefaultPrettyPrinter() .writeValueAsString(map);

ObjectMapper adalah pemetaan serialisasi Jackson, yang memungkinkan kita membuat siri peta kita dan menuliskannya sebagai JSON String yang dicetak cantik , menggunakan kaedah toString () dalam String :

{ "key" : "value" }

3.2. Serialisasi Peta

Anda boleh membuat siri peta yang mengandungi kelas Java khusus dengan beberapa langkah tambahan. Mari buat kelas MyPair untuk mewakili sepasang objek String yang berkaitan .

Catatan: pengambil / setter harus terbuka, dan kami memberi penjelasan kepadaString () dengan @JsonValue untuk memastikan Jackson menggunakan customString ini () semasa membuat siri:

public class MyPair { private String first; private String second; @Override @JsonValue public String toString() { return first + " and " + second; } // standard getter, setters, equals, hashCode, constructors }

Sekarang mari kita beritahu Jackson cara membuat siri MyPair dengan memperluas JsonSerializer Jackson :

public class MyPairSerializer extends JsonSerializer { private ObjectMapper mapper = new ObjectMapper(); @Override public void serialize(MyPair value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { StringWriter writer = new StringWriter(); mapper.writeValue(writer, value); gen.writeFieldName(writer.toString()); } }

JsonSerializer , seperti namanya, serializes MyPair untuk JSON menggunakan MyPair 's toString () kaedah. Jackson menyediakan banyak kelas Serializer yang sesuai dengan keperluan siri anda.

Kami menerapkan MyPairSerializer ke Peta kami dengan anotasi @JsonSerialize . Perhatikan bahawa kami hanya memberitahu Jackson cara membuat siri MyPair kerana sudah tahu bagaimana cara membuat siri String:

@JsonSerialize(keyUsing = MyPairSerializer.class) Map map;

Mari uji siri peta kami:

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

Output JSON bersiri adalah:

{ "Abbott and Costello" : "Comedy" }

3.3. Serialisasi Peta

Kes yang paling rumit adalah membuat siri Peta , tetapi sebahagian besar kerja sudah selesai. Mari gunakan Jackson's MapSerializer untuk peta kami, dan MyPairSerializer dari bahagian sebelumnya untuk kunci dan jenis nilai peta:

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

Mari kita uji bersiri Peta kami :

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

JSON output bersiri, menggunakan MyPair 's toString () kaedah, adalah:

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

4. Deserialisasi

Deserialization mengubah aliran bait menjadi objek Java yang dapat kita gunakan dalam kod. Dalam seksyen ini, kami akan deserialize JSON input ke dalam Peta s tandatangan yang berbeza.

4.1. Deserialisasi Peta

Untuk kes mudahnya, mari kita mengambil rentetan input berformat JSON dan mengubahnya menjadi koleksi Map Java:

String jsonInput = "{\"key\": \"value\"}"; TypeReference
    
      typeRef = new TypeReference
     
      () {}; Map map = mapper.readValue(jsonInput, typeRef);
     
    

Kami menggunakan Jackson's ObjectMapper seperti yang kami lakukan untuk serialisasi, menggunakan readValue () untuk memproses input. Perhatikan juga penggunaan Jackson's TypeReference , yang akan kami gunakan dalam semua contoh deserialisasi kami, untuk menerangkan jenis Peta destinasi kami . Berikut adalah representasi toString () peta kami:

{key=value}

4.2. Deserialisasi Peta

Sekarang, mari ubah input JSON dan TypeReference tujuan kami ke Peta :

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

Kita perlu membuat konstruktor untuk MyPair yang mengambil rentetan dengan kedua-dua elemen dan menghuraikannya ke elemen MyPair :

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

And the toString() of our Map object is:

{Abbott and Costello=Comedy}

There is another option for the case when we deserialize into a Java class that contains a Map — we can use Jackson's KeyDeserializer class, one of many Deserialization classes that Jackson offers. We annotate our ClassWithAMap with @JsonCreator, @JsonProperty, and @JsonDeserialize:

public class ClassWithAMap { @JsonProperty("map") @JsonDeserialize(keyUsing = MyPairDeserializer.class) private Map map; @JsonCreator public ClassWithAMap(Map map) { this.map = map; } // public getters/setters omitted }

We are telling Jackson to deserialize the Map contained in ClassWithAMap, so we need to extend KeyDeserializer to describe how to deserialize the map's key, a MyPair object, from an input String:

public class MyPairDeserializer extends KeyDeserializer { @Override public MyPair deserializeKey( String key, DeserializationContext ctxt) throws IOException, JsonProcessingException { return new MyPair(key); } }

Kami menguji deserialisasi menggunakan readValue :

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

Sekali lagi, kaedah toString () peta ClassWithAMap kami memberikan output yang kami harapkan:

{Abbott and Costello=Comedy}

4.3. Deserialisasi Peta

Akhir sekali, mari ubah input JSON dan TypeReference destinasi kami ke Peta :

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

Dan toString () objek Peta kami adalah:

{Abbott and Costello=Comedy and 1940s}

5. Kesimpulan

Dalam tutorial ringkas ini, kami telah melihat bagaimana untuk membuat siri dan deserialisasi Peta Java ke dan dari String berformat JSON.

Seperti biasa, anda boleh melihat contoh yang diberikan dalam artikel ini di repositori GitHub.