1. 概要

これは、XStreamに関するシリーズの3番目の記事です。 JavaオブジェクトをXMLに変換するおよびその逆での基本的な使用法について知りたい場合は、以前の記事を参照してください。

XStreamは、XML処理機能に加えて、JavaオブジェクトをJSONとの間で変換することもできます。 このチュートリアルでは、これらの機能について学習します。

2. 前提条件

このチュートリアルを読む前に、このシリーズの最初の記事 を読んでください。この記事では、ライブラリの基本について説明しています。

3. 依存関係

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.18</version>
</dependency>

4. JSONドライバー

以前の記事では、XStreamインスタンスを設定する方法とXMLドライバーを選択する方法を学びました。 同様に、JSONとの間でオブジェクトを変換するために使用できる2つのドライバーがあります:JsonHierarchicalStreamDriverJettisonMappedXmlDriver

4.1. JsonHierarchicalStreamDriver

このドライバークラスは、オブジェクトをJSONにシリアル化できますが、オブジェクトに逆シリアル化することはできません。 追加の依存関係は必要なく、そのドライバークラスは自己完結型です。

4.2. JeffisonMappedXmlDriver

このドライバークラスは、JSONをオブジェクトとの間で変換できます。 このドライバークラスを使用して、jettison。の依存関係を追加する必要があります。

<dependency>
    <groupId>org.codehaus.jettison</groupId>
    <artifactId>jettison</artifactId>
    <version>1.4.1</version>
</dependency>

5. オブジェクトをJSONにシリアル化する

Customerクラスを作成しましょう。

public class Customer {

    private String firstName;
    private String lastName;
    private Date dob;
    private String age;
    private List<ContactDetails> contactDetailsList;
       
    // getters and setters
}

ageStringとして(おそらく予期せずに)作成したことに注意してください。 この選択については後で説明します。

5.1. JsonHierarchicalStreamDriverを使用する

JsonHierarchicalStreamDriver を渡して、XStreamインスタンスを作成します。

xstream = new XStream(new JsonHierarchicalStreamDriver());
dataJson = xstream.toXML(customer);

これにより、次のJSONが生成されます。

{
  "com.baeldung.pojo.Customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:22:18.186 UTC",
    "age": "30",
    "contactDetailsList": [
      {
        "mobile": "6673543265",
        "landline": "0124-2460311"
      },
      {
        "mobile": "4676543565",
        "landline": "0120-223312"
      }
    ]
  }
}

5.2. JettisonMappedXmlDriverの実装

JettisonMappedXmlDriverクラスを渡してインスタンスを作成します。

xstream = new XStream(new JettisonMappedXmlDriver());
dataJson = xstream.toXML(customer);

これにより、次のJSONが生成されます。

{
  "com.baeldung.pojo.Customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:25:50.745 UTC",
    "age": 30,
    "contactDetailsList": [
      {
        "com.baeldung.pojo.ContactDetails": [
          {
            "mobile": 6673543265,
            "landline": "0124-2460311"
          },
          {
            "mobile": 4676543565,
            "landline": "0120-223312"
          }
        ]
      }
    ]
  }
}

5.3. 分析

2つのドライバーからの出力に基づいて、生成されたJSONに若干の違いがあることがはっきりとわかります。 たとえば、 JettisonMappedXmlDriver は、データ型が java.lang.String であるにもかかわらず、数値の二重引用符を省略します。

"mobile": 4676543565,
"age": 30,

一方、 JsonHierarchicalStreamDriver は、二重引用符を保持します。

6. JSONをオブジェクトに逆シリアル化する

次のJSONを使用して、Customerオブジェクトに変換し直してみましょう。

{
  "customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:41:01.987 UTC",
    "age": 30,
    "contactDetailsList": [
      {
        "com.baeldung.pojo.ContactDetails": [
          {
            "mobile": 6673543265,
            "landline": "0124-2460311"
          },
          {
            "mobile": 4676543565,
            "landline": "0120-223312"
          }
        ]
      }
    ]
  }
}

JSONを逆シリアル化できるのは1つのドライバー( JettisonMappedXMLDriver )のみであることを思い出してください。 この目的で JsonHierarchicalStreamDriver を使用しようとすると、UnsupportedOperationExceptionが発生します。

Jettisonドライバーを使用して、Customerオブジェクトを逆シリアル化できます。

customer = (Customer) xstream.fromXML(dataJson);

7. 結論

この記事では、JSON処理機能XStream、オブジェクトをJSONとの間で変換する方法について説明しました。 また、JSON出力を微調整して、より短く、よりシンプルで、より読みやすくする方法についても検討しました。

XStreamのXML処理と同様に、アノテーションまたはプログラム構成のいずれかを使用してインスタンスを構成することにより、JSONのシリアル化方法をさらにカスタマイズできる他の方法があります。 詳細と例については、このシリーズの最初の記事を参照してください。

例を含む完全なソースコードは、リンクされたGitHubリポジトリからダウンロードできます。