Peta Serialisasi dan Deserialisasi dengan Jackson

1. Ikhtisar

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

Kami akan mengilustrasikan cara membuat serial 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 bisa mendapatkan Jackson versi terbaru di sini.

3. Serialisasi

Serialisasi mengubah objek Java menjadi aliran byte, yang dapat disimpan atau dibagikan sesuai kebutuhan. Java Maps adalah koleksi yang memetakan Objek kunci ke Objek nilai dan sering kali merupakan objek yang paling tidak intuitif untuk diserialkan.

3.1. Serialisasi Peta

Untuk kasus sederhana, mari buat Peta dan buat serial ke JSON:

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

ObjectMapper adalah pemeta serialisasi Jackson, yang memungkinkan kita untuk membuat serial peta kita dan menuliskannya sebagai JSON String yang dicetak dengan cantik , menggunakan metode toString () di String :

{ "key" : "value" }

3.2. Serialisasi Peta

Anda dapat membuat serial peta yang berisi kelas Java khusus dengan beberapa langkah tambahan. Mari buat kelas MyPair untuk mewakili sepasang objek String terkait .

Catatan: getter / setter harus bersifat publik, dan kami menganotasi toString () dengan @JsonValue untuk memastikan Jackson menggunakan toString () kustom ini saat membuat serial:

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 beri tahu Jackson cara membuat serial 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 () metode. Jackson menyediakan banyak kelas Serializer agar sesuai dengan kebutuhan serialisasi Anda.

Kami menerapkan MyPairSerializer ke Peta kami dengan anotasi @JsonSerialize . Perhatikan bahwa kami hanya memberi tahu Jackson cara membuat serial MyPair karena sudah tahu cara membuat serial String:

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

Mari kita uji serialisasi peta kita:

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

Keluaran JSON serial adalah:

{ "Abbott and Costello" : "Comedy" }

3.3. Serialisasi Peta

Kasus yang paling kompleks adalah membuat serial Peta , tetapi sebagian besar pekerjaan sudah selesai. Mari gunakan Jackson's MapSerializer untuk peta kita, dan MyPairSerializer dari bagian sebelumnya untuk kunci peta dan tipe nilai:

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

Mari kita uji serialisasi Peta kita :

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

JSON output serial, menggunakan MyPair 's () toString metode, adalah:

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

4. Deserialisasi

Deserialization mengubah aliran byte menjadi objek Java yang dapat kita gunakan dalam kode. Pada bagian ini, kita akan deserialize JSON masukan ke dalam Peta s tanda tangan yang berbeda.

4.1. Peta Deserialization

Untuk kasus sederhana, mari kita ambil string 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 ObjectMapper Jackson seperti yang kami lakukan untuk serialisasi, menggunakan readValue () untuk memproses input. Juga, perhatikan penggunaan kami atas TypeReference Jackson , yang akan kami gunakan di semua contoh deserialisasi kami, untuk menjelaskan jenis Peta tujuan kami . Berikut adalah representasi toString () dari peta kita:

{key=value}

4.2. Peta Deserialization

Sekarang, mari kita ubah input JSON dan TypeReference tujuan kita ke Map :

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

Kita perlu membuat konstruktor untuk MyPair yang mengambil String dengan kedua elemen dan mem- parsingnya 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, metode toString () dari peta ClassWithAMap kita memberi kita keluaran yang kita harapkan:

{Abbott and Costello=Comedy}

4.3. Peta Deserialization

Terakhir, mari kita ubah input JSON dan TypeReference tujuan kita ke Map :

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

Dan toString () dari objek Map kita adalah:

{Abbott and Costello=Comedy and 1940s}

5. Kesimpulan

Dalam tutorial singkat ini, kita telah melihat cara membuat serial dan deserialisasi Java Maps ke dan dari Strings berformat JSON.

Seperti biasa, Anda dapat melihat contoh yang diberikan dalam artikel ini di repositori GitHub.