Panduan Pengguna XStream: Mengonversi XML ke Objek

1. Ikhtisar

Di artikel sebelumnya, kita belajar bagaimana menggunakan XStream untuk membuat serial objek Java ke XML. Dalam tutorial ini, kita akan belajar bagaimana melakukan kebalikannya: deserialisasi XML ke objek Java. Tugas-tugas ini dapat diselesaikan menggunakan anotasi atau secara terprogram.

Untuk mempelajari tentang persyaratan dasar untuk menyiapkan XStream dan dependensinya, lihat artikel sebelumnya.

2. Deserialisasi Objek dari XML

Untuk memulainya, misalkan kita memiliki XML berikut ini:

 John Doe 1986-02-14 03:46:16.381 UTC 

Kita perlu mengonversinya menjadi objek Java Customer :

public class Customer { private String firstName; private String lastName; private Date dob; // standard setters and getters } 

XML dapat dimasukkan dengan berbagai cara, termasuk File , InputStream , Reader , atau String . Untuk kesederhanaan, kami akan berasumsi bahwa kami memiliki XML di atas dalam objek String .

Customer convertedCustomer = (Customer) xstream.fromXML(customerXmlString); Assert.assertTrue(convertedCustomer.getFirstName().equals("John"));

3. Alias

Dalam contoh pertama, XML memiliki nama kelas yang sepenuhnya memenuhi syarat di tag XML terluar, yang cocok dengan lokasi kelas Pelanggan kami . Dengan pengaturan ini, XStream dengan mudah mengubah XML ke objek kami tanpa konfigurasi tambahan. Tetapi kita mungkin tidak selalu memiliki kondisi ini. Kami mungkin tidak memiliki kontrol atas penamaan tag XML, atau kami mungkin memutuskan untuk menambahkan alias untuk bidang.

Misalnya, kita memodifikasi XML kita agar tidak menggunakan nama kelas yang sepenuhnya memenuhi syarat untuk tag luar:

 John Doe 1986-02-14 03:46:16.381 UTC 

Kita bisa menyembunyikan XML ini dengan membuat alias.

3.1. Alias ​​Kelas

Kami mendaftarkan alias dengan instance XStream baik secara terprogram atau menggunakan anotasi. Kami dapat memberi anotasi kelas Pelanggan kami dengan @XStreamAlias :

@XStreamAlias("customer") public class Customer { //... }

Sekarang kita perlu mengkonfigurasi instance XStream kita untuk menggunakan anotasi ini:

xstream.processAnnotations(Customer.class);

Sebagai alternatif, jika kita ingin mengkonfigurasi sebuah alias secara terprogram, kita dapat menggunakan kode di bawah ini:

xstream.alias("customer", Customer.class);

3.2. Alias ​​Bidang

Misalkan kita memiliki XML berikut ini:

 John Doe 1986-02-14 03:46:16.381 UTC 

The fn tag tidak sesuai bidang apapun dalam kami Pelanggan objek, jadi kita perlu mendefinisikan alias untuk bidang itu jika kita ingin deserialize. Kami dapat mencapai ini menggunakan anotasi berikut:

@XStreamAlias("fn") private String firstName;

Atau, kita dapat mencapai tujuan yang sama secara terprogram:

xstream.aliasField("fn", Customer.class, "firstName");

4. Koleksi Implisit

Katakanlah kita memiliki XML berikut, berisi daftar sederhana dari ContactDetails :

 John Doe 1986-02-14 04:14:20.541 UTC  6673543265 0124-2460311  ... 

Kami ingin memuat daftar ContactDetails ke dalam bidang Daftar di objek Java kami. Kami dapat mencapai ini dengan menggunakan anotasi berikut:

@XStreamImplicit private List contactDetailsList;

Atau, kita dapat mencapai tujuan yang sama secara terprogram:

xstream.addImplicitCollection(Customer.class, "contactDetailsList");

5. Abaikan Fields

Katakanlah kita memiliki XML berikut ini:

 John Doe 1986-02-14 04:14:20.541 UTC John Doe 

Dalam XML di atas, kami memiliki elemen tambahan yang hilang dari objek Pelanggan Java kami .

Jika kita mencoba deserialisasi xml di atas tanpa memperhatikan elemen tambahan, program akan melontarkan UnknownFieldException .

No such field com.baeldung.pojo.Customer.fullName

Seperti yang dinyatakan dengan jelas pengecualian, XStream tidak mengenali field fullName .

Untuk mengatasi masalah ini kita perlu mengkonfigurasinya untuk mengabaikan elemen yang tidak diketahui:

xstream.ignoreUnknownElements();

6. Bidang Atribut

Misalkan kita memiliki XML dengan atribut sebagai bagian dari elemen yang ingin kita deserialisasi sebagai bidang di objek kita. Kami akan menambahkan atribut contactType ke objek ContactDetails kami :

 6673543265 0124-2460311 

Jika kita ingin deserialisasi atribut contactType XML, kita dapat menggunakan anotasi @XStreamAsAttribute pada bidang yang kita inginkan untuk muncul di:

@XStreamAsAttribute private String contactType;

Atau, kita dapat mencapai tujuan yang sama secara terprogram:

xstream.useAttributeFor(ContactDetails.class, "contactType");

7. Kesimpulan

Pada artikel ini, kami menjelajahi opsi yang kami miliki saat deserializing XML ke objek Java menggunakan XStream.

Kode sumber lengkap untuk artikel ini dapat diunduh dari repositori GitHub yang ditautkan.