Konversi XML ke JSON Menggunakan Jackson

1. Ikhtisar

Dalam tutorial ini, kita akan melihat bagaimana mengubah pesan XML menjadi JSON menggunakan Jackson.

Untuk pembaca yang baru mengenal Jackson, pertimbangkan untuk memahami dasar-dasarnya terlebih dahulu.

2. Pengantar Jackson

Kita dapat memikirkan tentang mengurai JSON dalam tiga cara berbeda dengan Jackson:

  • Yang pertama dan paling umum adalah data binding dengan ObjectMapper
  • Yang kedua adalah pemetaan ke struktur data pohon dengan TreeTraversingParser dan JsonNode
  • Dan yang ketiga adalah streaming struktur data pohon dengan token, menggunakan JsonParser dan JsonGenerator

Sekarang, Jackson juga mendukung dua yang pertama untuk data XML. Karena itu, mari kita lihat bagaimana Jackson dapat membantu kita melakukan konversi dari satu format ke format lainnya.

3. Ketergantungan

Pertama, kita perlu menambahkan dependensi jackson-databind ke pom.xml kita :

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Perpustakaan ini akan memungkinkan kita untuk menggunakan API pengikatan data.

Yang kedua adalah jackson-dataformat-xml yang menambahkan dukungan XML Jackson:

 com.fasterxml.jackson.dataformat jackson-dataformat-xml 2.11.1 

4. Pengikatan Data

Data binding, sederhananya, adalah ketika kita ingin memetakan data serial secara langsung ke objek Java.

Untuk menjelajahi ini, mari kita definisikan XML dengan properti Bunga dan Warna :

 Poppy RED 9  

Ini mirip dengan notasi Java ini:

public class Flower { private String name; private Color color; private Integer petals; // getters and setters } public enum Color { PINK, BLUE, YELLOW, RED; }

Langkah pertama kita adalah mengurai XML menjadi instance Flower . Untuk melakukan itu, mari buat instance XmlMapper , XML Jackson yang setara dengan ObjectMapper dan gunakan metode readValue :

XmlMapper xmlMapper = new XmlMapper(); Flower poppy = xmlMapper.readValue(xml, Flower.class);

Setelah kami memiliki instance Flower kami , kami akan ingin menuliskannya sebagai JSON menggunakan ObjectMapper yang sudah dikenal :

ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(poppy);

Dan, sebagai hasilnya, kami mendapatkan JSON yang setara:

{ "name":"Poppy", "color":"RED", "petals":9 }

5. Tree Traversal

Kadang-kadang, melihat langsung ke struktur pohon dapat menawarkan lebih banyak fleksibilitas, seperti dalam kasus di mana kita tidak ingin mempertahankan kelas perantara atau kita hanya ingin mengonversi sebagian dari struktur.

Padahal, seperti yang akan kita lihat, itu datang dengan beberapa pengorbanan.

Langkah pertama mirip dengan langkah pertama kami saat kami menggunakan data binding. Kali ini, kami akan menggunakan metode readTree :

XmlMapper xmlMapper = new XmlMapper(); JsonNode node = xmlMapper.readTree(xml.getBytes());

Setelah melakukan ini, kita akan memiliki JsonNode yang memiliki 3 anak, seperti yang diharapkan: nama, warna, dan kelopak .

Kemudian, kita dapat kembali menggunakan ObjectMapper , cukup mengirimkan JsonNode kita sebagai gantinya:

ObjectMapper jsonMapper = new ObjectMapper(); String json = jsonMapper.writeValueAsString(node);

Sekarang, hasilnya sedikit berbeda dibandingkan dengan contoh terakhir kami:

{ "name":"Poppy", "color":"RED", "petals":"9" }

Setelah diperiksa dengan cermat, kita dapat melihat bahwa atribut petals diserialkan menjadi string, bukan nomor! Ini karena readTree tidak menyimpulkan tipe data tanpa definisi eksplisit.

5.1. Batasan

Dan, ada batasan tertentu dengan dukungan traversal pohon XML Jackson:

  • Jackson tidak bisa membedakan antara Object dan Array. Karena XML tidak memiliki struktur asli untuk membedakan objek dari daftar objek, Jackson hanya akan menyusun elemen berulang menjadi satu nilai.
  • Dan, karena Jackson ingin memetakan setiap elemen XML ke node JSON, Jackson tidak mendukung konten campuran.

Karena alasan ini, dokumen resmi Jackson menyarankan agar tidak menggunakan model Tree untuk mengurai XML.

6. Batasan Memori

Sekarang, keduanya memiliki kelemahan penting bahwa seluruh XML harus berada di memori sekaligus untuk melakukan konversi. Sampai Jackson mendukung streaming struktur pohon sebagai token, kita akan terjebak dengan batasan ini atau kita perlu melihat menggulirkan struktur pohon kita sendiri dengan sesuatu seperti XMLStreamReader.

7. Kesimpulan

Dalam tutorial ini, kami secara singkat mempelajari berbagai cara di mana Jackson dapat membaca data XML dan menulisnya ke JSON. Selain itu, kami melihat sekilas batasan dari setiap pendekatan yang didukung.

Seperti biasa, kode sumber lengkap yang menyertai tutorial tersedia di GitHub.