Tukarkan XML ke JSON Menggunakan Jackson

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat cara menukar mesej XML ke JSON menggunakan Jackson.

Bagi pembaca yang baru mengenali Jackson, pertimbangkan untuk mengetahui asasnya terlebih dahulu.

2. Pengenalan Jackson

Kita boleh memikirkan menguraikan JSON dengan tiga cara berbeza dengan Jackson:

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

Sekarang, Jackson juga menyokong dua yang pertama untuk data XML. Oleh itu, mari kita lihat bagaimana Jackson dapat membantu kita melakukan penukaran dari satu format ke format lain.

3. Kebergantungan

Pertama, kita perlu menambahkan kebergantungan jackson-databaseind ke pom.xml kami :

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Perpustakaan ini akan membolehkan kami menggunakan API pengikat data.

Yang kedua ialah jackson-dataformat-xml yang menambahkan sokongan XML Jackson:

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

4. Pengikatan Data

Pengikatan data, secara sederhana, adalah ketika kita ingin memetakan data bersiri secara langsung ke objek Java.

Untuk menerokainya, mari tentukan XML kami dengan sifat Bunga dan Warna :

 Poppy RED 9  

Ini serupa 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 kami adalah menguraikan XML ke instance Bunga . Untuk melakukannya, mari kita buat contoh XmlMapper , Jackson XML yang setara dengan ObjectMapper dan gunakan kaedah readValuenya :

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

Sebaik sahaja kita mempunyai contoh Bunga kita, kita ingin menulisnya sebagai JSON menggunakan ObjectMapper yang sudah biasa :

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

Hasilnya, kami mendapat setara JSON kami:

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

5. Melintasi Pokok

Kadang-kadang, melihat struktur pokok secara langsung dapat memberikan lebih banyak fleksibiliti, seperti jika kita tidak mahu mengekalkan kelas perantara atau kita hanya ingin mengubah sebahagian strukturnya.

Walaupun, seperti yang akan kita lihat, ia datang dengan beberapa pertukaran.

Langkah pertama adalah serupa dengan langkah pertama kami ketika menggunakan data binding. Namun, kali ini kami akan menggunakan kaedah readTree :

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

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

Kemudian, kita dapat menggunakan ObjectMapper sekali lagi , dengan hanya menghantar JsonNode kami :

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

Sekarang, hasilnya sedikit berbeza berbanding contoh terakhir kami:

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

Setelah diperiksa dengan teliti, kita dapat melihat bahawa atribut kelopak bersiri menjadi rentetan dan bukan angka! Ini kerana readTree tidak menyimpulkan jenis data tanpa definisi yang jelas.

5.1. Batasan

Dan, terdapat batasan tertentu dengan sokongan melintasi pokok XML Jackson:

  • Jackson tidak dapat membezakan antara Objek dan Array. Oleh kerana XML tidak mempunyai struktur asli untuk membezakan objek dari senarai objek, Jackson hanya akan menggabungkan elemen berulang menjadi satu nilai.
  • Dan, kerana Jackson ingin memetakan setiap elemen XML ke simpul JSON, ia tidak menyokong kandungan campuran.

Atas sebab-sebab ini, dokumen rasmi Jackson mengesyorkan agar tidak menggunakan model Tree untuk menguraikan XML.

6. Kekangan Memori

Sekarang, kedua-duanya mempunyai kelemahan yang ketara bahawa seluruh XML perlu ada dalam memori sekaligus untuk melakukan penukaran. Sehingga Jackson menyokong penstriman struktur pokok sebagai token, kita akan terjebak dengan kekangan ini atau kita perlu melihat sendiri bagaimana kita menggunakan XMLStreamReader.

7. Kesimpulannya

Dalam tutorial ini, kami secara ringkas mempelajari pelbagai cara di mana Jackson dapat membaca data XML dan menulisnya ke JSON. Kami juga melihat sekilas batasan setiap pendekatan yang disokong.

Seperti biasa, kod sumber lengkap yang menyertai tutorial boleh didapati di GitHub.