Memulai Deserialization Kustom di Jackson

1. Ikhtisar

Tutorial singkat ini akan mengilustrasikan cara menggunakan Jackson 2 untuk menghilangkan nama JSON menggunakan Deserializer kustom .

Jika Anda ingin menggali lebih dalam dan mempelajari hal-hal keren lainnya yang dapat Anda lakukan dengan Jackson 2 - lanjutkan ke tutorial utama Jackson.

2. Deserialisasi Standar

Mari kita mulai dengan mendefinisikan 2 entitas dan melihat bagaimana Jackson akan menghentikan representasi JSON ke entitas ini tanpa penyesuaian apa pun:

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

Sekarang, mari tentukan representasi JSON yang ingin kita deserialisasi:

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

Dan terakhir, mari kita uraikan JSON ini ke Entitas Java:

Item itemWithOwner = new ObjectMapper().readValue(json, Item.class);

3. Deserializer Kustom di ObjectMapper

Pada contoh sebelumnya, representasi JSON sangat cocok dengan entitas java - selanjutnya, kita akan menyederhanakan JSON:

{ "id": 1, "itemName": "theItem", "createdBy": 2 }

Saat mengurungkan ini ke entitas yang sama persis - secara default, ini tentu saja akan gagal:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "createdBy" (class org.baeldung.jackson.dtos.Item), not marked as ignorable (3 known properties: "id", "owner", "itemName"]) at [Source: [email protected]; line: 1, column: 43] (through reference chain: org.baeldung.jackson.dtos.Item["createdBy"])

Kami akan menyelesaikan ini dengan melakukan deserialisasi kami sendiri dengan Deserializer khusus :

public class ItemDeserializer extends StdDeserializer { public ItemDeserializer() { this(null); } public ItemDeserializer(Class vc) { super(vc); } @Override public Item deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { JsonNode node = jp.getCodec().readTree(jp); int id = (Integer) ((IntNode) node.get("id")).numberValue(); String itemName = node.get("itemName").asText(); int userId = (Integer) ((IntNode) node.get("createdBy")).numberValue(); return new Item(id, itemName, new User(userId, null)); } }

Seperti yang Anda lihat, deserializer bekerja dengan representasi Jackson standar JSON - JsonNode . Setelah JSON masukan direpresentasikan sebagai JsonNode , sekarang kita dapat mengekstrak informasi yang relevan darinya dan membangun entitas Item kita sendiri .

Sederhananya, kita perlu mendaftarkan deserializer khusus ini dan cukup melakukan deserialisasi JSON secara normal:

ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addDeserializer(Item.class, new ItemDeserializer()); mapper.registerModule(module); Item readValue = mapper.readValue(json, Item.class);

4. Deserializer Kustom di Kelas

Sebagai alternatif, kami juga dapat mendaftarkan deserializer langsung di kelas :

@JsonDeserialize(using = ItemDeserializer.class) public class Item { ... }

Dengan deserializer yang ditentukan di tingkat kelas, tidak perlu mendaftarkannya di ObjectMapper - mapper default akan berfungsi dengan baik:

Item itemWithOwner = new ObjectMapper().readValue(json, Item.class);

Jenis konfigurasi per kelas ini sangat berguna dalam situasi di mana kita mungkin tidak memiliki akses langsung ke ObjectMapper mentah untuk dikonfigurasi.

5. Kesimpulan

Artikel ini menunjukkan cara memanfaatkan Jackson 2 untuk membaca masukan JSON non-standar - dan cara memetakan masukan tersebut ke grafik entitas java dengan kontrol penuh atas pemetaan.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di lebih dari GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.