1概要

/xstream-serialize-object-to-xml[前の記事]では、XStreamを使用してJavaオブジェクトをXMLにシリアル化する方法を学びました。このチュートリアルでは、その逆の方法を学びます。XMLをJavaオブジェクトに逆シリアル化します。

これらのタスクは、注釈を使用して、またはプログラム的に実行できます。

XStreamを設定するための基本的な要件とその依存関係については、前の記事を参照してください。


2 XMLからオブジェクトを逆シリアル化する

まず、次のXMLがあるとします。

<com.baeldung.pojo.Customer>
    <firstName>John</firstName>
    <lastName>Doe</lastName>
    <dob>1986-02-14 03:46:16.381 UTC</dob>
</com.baeldung.pojo.Customer>

これをJavaの

Customer

オブジェクトに変換する必要があります。

public class Customer {

    private String firstName;
    private String lastName;
    private Date dob;

   //standard setters and getters
}

XMLは、

File



InputStream



Reader

、または

String

など、さまざまな方法で入力できます。簡単にするために、上記のXMLが

String

オブジェクトにあると仮定します。

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


3エイリアス

最初の例では、XMLは最外部のXMLタグ内のクラスの完全修飾名を持ち、

Customer

クラスの場所と一致します。

この設定により、XStreamは特別な設定なしでXMLを簡単に私たちのオブジェクトに変換します。しかし、私たちはいつもこれらの条件を持っているとは限りません。 XMLタグの命名を制御できないか、フィールドに別名を追加することにします。

たとえば、外部タグに完全修飾クラス名を使用しないようにXMLを変更したとします。

<customer>
    <firstName>John</firstName>
    <lastName>Doe</lastName>
    <dob>1986-02-14 03:46:16.381 UTC</dob>
</customer>

エイリアスを作成することでこのXMLを変換できます。



プログラム的に、または注釈を使用して、エイリアスをXStreamインスタンスに登録します。

Customer

クラスに

@ XStreamAlias

というアノテーションを付けることができます。

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

今度はこのアノテーションを使うようにXStreamインスタンスを設定する必要があります。

xstream.processAnnotations(Customer.class);

あるいは、プログラムでエイリアスを設定したい場合は、
以下のコードを使用してください。

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


3.2. フィールドエイリアス

次のXMLがあるとします。

<customer>
    <fn>John</fn>
    <lastName>Doe</lastName>
    <dob>1986-02-14 03:46:16.381 UTC</dob>
</customer>


fn

タグは、

Customer

オブジェクトのどのフィールドとも一致しません。そのため、シリアル化を解除する場合は、そのフィールドのエイリアスを定義する必要があります。これを実現するには、次のアノテーションを使用します。

@XStreamAlias("fn")
private String firstName;

あるいは、プログラムで同じ目標を達成することもできます。

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


4.


暗黙のコレクション

次のXMLがあり、

ContactDetails

の簡単なリストが含まれているとしましょう。

<customer>
    <firstName>John</firstName>
    <lastName>Doe</lastName>
    <dob>1986-02-14 04:14:20.541 UTC</dob>
    <ContactDetails>
        <mobile>6673543265</mobile>
        <landline>0124-2460311</landline>
    </ContactDetails>
    <ContactDetails>...</ContactDetails>
</customer>

Javaオブジェクトの

List <ContactDetails>

フィールドに

ContactDetails

のリストをロードします。これを実現するには、次のアノテーションを使用します。

@XStreamImplicit
private List<ContactDetails> contactDetailsList;

あるいは、プログラムで同じ目標を達成することもできます。

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


5.

** フィールドを無視+

**

次のようなXMLがあるとしましょう。

<customer>
    <firstName>John</firstName>
    <lastName>Doe</lastName>
    <dob>1986-02-14 04:14:20.541 UTC</dob>
    <fullName>John Doe</fullName>
</customer>

上記のXMLでは、Javaの

Customer

オブジェクトにはない、余分な要素

<fullName>

があります。

余分な要素を気にせずに上記のXMLを逆シリアル化しようとすると、プログラムは

UnknownFieldException

をスローします。

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

例外が明確に述べているように、XStreamはフィールド

fullName

を認識しません。

この問題を克服するには、未知の要素を無視するように設定する必要があります。

xstream.ignoreUnknownElements();


6. 属性フィールド

オブジェクトのフィールドとして逆シリアル化したい要素の一部として属性を持つXMLがあるとします。

ContactDetails

オブジェクトに

contactType

属性を追加します。

<ContactDetails contactType="Office">
    <mobile>6673543265</mobile>
    <landline>0124-2460311</landline>
</ContactDetails>


contactType

XML属性を逆シリアル化する場合は、表示するフィールドに

@ XStreamAsAttribute

アノテーションを使用できます。

@XStreamAsAttribute
private String contactType;

あるいは、プログラムで同じ目標を達成することもできます。

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


7. 結論

この記事では、XStreamを使用してXMLをJavaオブジェクトにデシリアライズするときに使用できるオプションについて説明しました。

この記事の完全なソースコードは、リンクされたhttps://github.com/eugenp/tutorials/tree/master/xstream[GitHub repository]からダウンロードできます。