1. Gambaran keseluruhan
Dalam artikel sebelumnya, kami belajar bagaimana menggunakan XStream untuk menyusun objek Java ke XML. Dalam tutorial ini, kita akan belajar bagaimana melakukan sebaliknya: deserialize XML ke objek Java. Tugas-tugas ini dapat diselesaikan dengan menggunakan anotasi atau secara terprogram.
Untuk mengetahui tentang keperluan asas untuk mengatur XStream dan pergantungannya, sila rujuk artikel sebelumnya.
2. Mendesialisasikan Objek dari XML
Sebagai permulaan, anggaplah kita mempunyai XML berikut:
John Doe 1986-02-14 03:46:16.381 UTC
Kita perlu mengubahnya menjadi objek Pelanggan Java :
public class Customer { private String firstName; private String lastName; private Date dob; // standard setters and getters }
XML dapat dimasukkan dalam beberapa cara, termasuk File , InputStream , Reader , atau String . Untuk kesederhanaan, kami akan menganggap bahawa kami mempunyai XML di atas dalam objek String .
Customer convertedCustomer = (Customer) xstream.fromXML(customerXmlString); Assert.assertTrue(convertedCustomer.getFirstName().equals("John"));
3. Alias
Dalam contoh pertama, XML mempunyai nama kelas yang memenuhi syarat sepenuhnya dalam teg XML terluar, yang sesuai dengan lokasi kelas Pelanggan kami . Dengan persediaan ini, XStream menukar XML ke objek kita dengan mudah tanpa konfigurasi tambahan. Tetapi kita mungkin tidak selalu mempunyai syarat ini. Kami mungkin tidak mempunyai kawalan terhadap penamaan tag XML, atau kami mungkin memutuskan untuk menambahkan alias untuk bidang.
Sebagai contoh, andaikan kita mengubahsuai XML kita agar tidak menggunakan nama kelas yang memenuhi syarat untuk teg luar:
John Doe 1986-02-14 03:46:16.381 UTC
Kami dapat menyembunyikan XML ini dengan membuat alias.
3.1. Alias Kelas
Kami mendaftarkan alias dengan instance XStream sama ada secara terprogram atau menggunakan anotasi. Kami dapat memberi penjelasan kepada kelas Pelanggan kami dengan @XStreamAlias :
@XStreamAlias("customer") public class Customer { //... }
Sekarang kita perlu mengkonfigurasi instance XStream kami untuk menggunakan anotasi ini:
xstream.processAnnotations(Customer.class);
Sebagai alternatif, jika kita ingin mengkonfigurasi alias secara terprogram, kita boleh menggunakan kod di bawah:
xstream.alias("customer", Customer.class);
3.2. Alias Bidang
Katakan kita mempunyai XML berikut:
John Doe 1986-02-14 03:46:16.381 UTC
The fn tag tidak sepadan sebarang medan dalam kita Pelanggan objek, jadi kita perlu menentukan alias untuk medan bahawa jika kita ingin deserialize ia. Kami dapat mencapainya dengan menggunakan penjelasan berikut:
@XStreamAlias("fn") private String firstName;
Sebagai alternatif, kita dapat mencapai matlamat yang sama secara terprogram:
xstream.aliasField("fn", Customer.class, "firstName");
4. Koleksi Tersirat
Katakan kita mempunyai XML berikut, yang mengandungi senarai ContactDetails ringkas :
John Doe 1986-02-14 04:14:20.541 UTC 6673543265 0124-2460311 ...
Kita mahu untuk memuatkan senarai ContactDetails ke dalam Senarai bidang dalam objek Java kami. Kami dapat mencapainya dengan menggunakan penjelasan berikut:
@XStreamImplicit private List contactDetailsList;
Sebagai alternatif, kita dapat mencapai matlamat yang sama secara terprogram:
xstream.addImplicitCollection(Customer.class, "contactDetailsList");
5. Abaikan Medan
Katakan kita mengikuti XML:
John Doe 1986-02-14 04:14:20.541 UTC John Doe
Dalam XML di atas, kami mempunyai elemen tambahan yang hilang dari objek Pelanggan Java kami .
Sekiranya kita cuba mendeserialisasikan xml di atas tanpa mengambil perhatian terhadap elemen tambahan, program membuang UnknownFieldException .
No such field com.baeldung.pojo.Customer.fullName
Seperti pengecualian yang dinyatakan dengan jelas, XStream tidak mengenali nama penuh nama .
Untuk mengatasi masalah ini, kita perlu mengkonfigurasinya untuk mengabaikan elemen yang tidak diketahui:
xstream.ignoreUnknownElements();
6. Medan Atribut
Anggaplah kita memiliki XML dengan atribut sebagai bagian dari elemen yang ingin kita deserialisasi sebagai medan dalam objek kita. Kami akan menambahkan atribut contactType ke objek ContactDetails kami :
6673543265 0124-2460311
Sekiranya kita ingin mendeserialisasikan atribut contactType XML, kita dapat menggunakan anotasi @XStreamAsAttribute di medan yang ingin kita muncul dalam:
@XStreamAsAttribute private String contactType;
Sebagai alternatif, kita dapat mencapai matlamat yang sama secara terprogram:
xstream.useAttributeFor(ContactDetails.class, "contactType");
7. Kesimpulannya
Dalam artikel ini, kami meneroka pilihan yang kami miliki ketika mendeserisasi XML ke objek Java menggunakan XStream.
Kod sumber lengkap untuk artikel ini boleh dimuat turun dari repositori GitHub yang dipautkan.