Jackson - Serializer Custom

1. Gambaran keseluruhan

Tutorial ringkas ini akan menunjukkan cara membuat serial Java entiti dengan Jackson 2 menggunakan Custom Serializer .

Sekiranya anda ingin menggali lebih mendalam dan mengetahui perkara menarik lain yang boleh anda lakukan dengan Jackson 2 - teruskan ke tutorial utama Jackson.

2. Serialisasi Standard Graf Objek

Mari kita tentukan 2 entiti mudah dan lihat bagaimana Jackson membuat siri ini tanpa logik tersuai:

public class User { public int id; public String name; } public class Item { public int id; public String itemName; public User owner; }

Sekarang, mari kita sirikan entiti Item dengan entiti Pengguna :

Item myItem = new Item(1, "theItem", new User(2, "theUser")); String serialized = new ObjectMapper().writeValueAsString(myItem);

Ini akan menghasilkan perwakilan JSON penuh untuk kedua-dua entiti:

{ "id": 1, "itemName": "theItem", "owner": { "id": 2, "name": "theUser" } }

3. Serializer Custom pada ObjectMapper

Sekarang, mari kita memudahkan output JSON atas oleh hanya serializing yang id daripada pengguna , bukan keseluruhan pengguna objek; kami ingin mendapatkan JSON berikut, lebih mudah:

{ "id": 25, "itemName": "FEDUfRgS", "owner": 15 }

Ringkasnya, kita harus menentukan Serializer khusus untuk objek Item :

public class ItemSerializer extends StdSerializer { public ItemSerializer() { this(null); } public ItemSerializer(Class t) { super(t); } @Override public void serialize( Item value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeNumberField("id", value.id); jgen.writeStringField("itemName", value.itemName); jgen.writeNumberField("owner", value.owner.id); jgen.writeEndObject(); } }

Sekarang, kita perlu mendaftarkan serializer khusus ini dengan ObjectMapper untuk kelas Item , dan melakukan serialisasi:

Item myItem = new Item(1, "theItem", new User(2, "theUser")); ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(Item.class, new ItemSerializer()); mapper.registerModule(module); String serialized = mapper.writeValueAsString(myItem);

Itu sahaja - kami kini mempunyai siriisasi JSON tersuai yang lebih sederhana dari entiti Item-> Pengguna .

4. Serializer Custom di Kelas

Kami juga dapat mendaftarkan serializer secara langsung di kelas , bukan di ObjectMapper :

@JsonSerialize(using = ItemSerializer.class) public class Item { ... }

Sekarang, semasa melakukan serialisasi standard :

Item myItem = new Item(1, "theItem", new User(2, "theUser")); String serialized = new ObjectMapper().writeValueAsString(myItem);

Kami akan mendapat output JSON khusus, yang dibuat oleh serializer, yang ditentukan melalui @JsonSerialize :

{ "id": 25, "itemName": "FEDUfRgS", "owner": 15 }

Ini berguna apabila ObjectMapper tidak dapat diakses dan dikonfigurasi secara langsung.

5. Kesimpulan

Artikel ini menggambarkan cara mendapatkan output JSON khusus dengan Jackson 2, dengan menggunakan Serializers.

Pelaksanaan semua contoh dan coretan kod ini boleh didapati di GitHub - ini adalah projek berasaskan Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.