JacksonによるXMLシリアライゼーションとデシリアライゼーション

1概要

この記事では、Jackson 2.xを使ってJavaオブジェクトをXMLデータにシリアライズし、それを逆シリアル化してPOJOに戻す方法を見ていきます。

多くの複雑さやカスタマイズを必要としない基本的な操作に焦点を当てます。

2 XmlMapper オブジェクト

XmlMapper は、Jackson 2.xのメインクラスで、シリアル化に役立ちます。そのため、そのインスタンスを作成する必要があります。

XmlMapper mapper = new XmlMapper();

XmlMapper jackson-dataformat-xml jarに含まれているので、__pom.xmlに依存関係として追加する必要があります。このチュートリアルではバージョン2.9.4を使用しますが、必ずhttps://search.mavenを使用してください。 org/classic/#検索%7Cgav%7C1%7Cg%3A%22com.fasterxml.jackson.dataformat%22%20AND%20a%3A%22jackson-dataformat-xml%22[最新バージョンをチェック]

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.4</version>
</dependency>

3 JavaをXMLにシリアライズする

XmlMapper は、JSONシリアライゼーションで使用される ObjectMapper のサブクラスです。しかし、それはいくつかのXML特有の微調整を親クラスに追加します。

実際のシリアライゼーションを行うためにそれをどのように使用するかを見てみましょう。オブジェクトをシリアル化するJavaクラスを作成しましょう。

class SimpleBean {
    private int x = 1;
    private int y = 2;
   //standard setters and getters
}

3.1. XML文字列へのシリアライズ

JavaオブジェクトをXML文字列にシリアル化できます。

@Test
public void whenJavaSerializedToXmlStr__thenCorrect() throws JsonProcessingException {
    XmlMapper xmlMapper = new XmlMapper();
    String xml = xmlMapper.writeValueAsString(new SimpleBean());
    assertNotNull(xml);
}

結果のXML文字列(読みやすくフォーマットされている):

<SimpleBean>
    <x>1</x>
    <y>2</y>
</SimpleBean>

3.2. XMLファイルにシリアライズ

後で使用するために、JavaオブジェクトをXMLファイルにシリアル化することもできます。

@Test
public void whenJavaSerializedToXmlFile__thenCorrect() throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    xmlMapper.writeValue(new File("simple__bean.xml"), new SimpleBean());
    File file = new File("simple__bean.xml");
    assertNotNull(file);
}

結果のファイル simple bean.xml__の内容。

<SimpleBean>
    <x>1</x>
    <y>2</y>
</SimpleBean>

4 XMLをJava に逆シリアル化する

このセクションでは、XMLからJavaオブジェクトを取得する方法について説明します。

4.1. XML文字列からのシリアル化解除

直列化と同様に、XML文字列を逆シリアル化してJavaオブジェクトに戻すこともできます。

@Test
public void whenJavaGotFromXmlStr__thenCorrect() throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    SimpleBean value =
      xmlMapper.readValue("<SimpleBean><x>1</x><y>2</y></SimpleBean>",
      SimpleBean.class);
    assertTrue(value.getX() == 1 && value.getY() == 2);
}

4.2. XMLファイルからのシリアル化解除

同様に、XMLファイルがある場合は、このセクションでそれをJavaオブジェクトに変換する方法を示します。

ここでは、まずファイルを入力ストリームに読み込み、次に簡単なユーティリティメソッドを使って入力ストリームを文字列に変換します。

残りのコードは、上記のセクション4.1のコードと似ています。

@Test
public void whenJavaGotFromXmlFile__thenCorrect() throws IOException {
    File file = new File("simple__bean.xml");
    XmlMapper xmlMapper = new XmlMapper();
    String xml = inputStreamToString(new FileInputStream(file));
    SimpleBean value = xmlMapper.readValue(xml, SimpleBean.class);
    assertTrue(value.getX() == 1 && value.getY() == 2);
}

実用的な方法:

public static String inputStreamToString(InputStream is) throws IOException {
    StringBuilder sb = new StringBuilder();
    String line;
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    while ((line = br.readLine()) != null) {
        sb.append(line);
    }
    br.close();
    return sb.toString();
}

5大文字の要素の処理

このセクションでは、逆シリアル化するために大文字化された要素を持つXMLがある、または大文字化された1つ以上の要素を持つXMLにJavaオブジェクトをシリアル化する必要があるシナリオの処理方法を調べます。

5.1. XML文字列からのシリアル化解除

1つのフィールドを大文字にしたXMLがあるとしましょう。

<SimpleBeanForCapitalizedFields>
    <X>1</X>
    <y>2</y>
</SimpleBeanForCapitalizedFields>

大文字化された要素を正しく処理するためには、 "@"フィールドに @ JsonProperty アノテーションを付ける必要があります。

class SimpleBeanForCapitalizedFields {
    @JsonProperty("X")
    private int x = 1;
    private int y = 2;

   //standard getters, setters
}

XML文字列を正しく逆シリアル化してJavaオブジェクトに戻すことができます。

@Test
public void whenJavaGotFromXmlStrWithCapitalElem__thenCorrect() throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    SimpleBeanForCapitalizedFields value = xmlMapper.
      readValue("<SimpleBeanForCapitalizedFields><X>1</X><y>2</y></SimpleBeanForCapitalizedFields>",
        SimpleBeanForCapitalizedFields.class);
    assertTrue(value.getX() == 1 && value.getY() == 2);
}

5.2. XML文字列へのシリアライズ

@ JsonPropertyを使用して必須フィールドに注釈を付けることで、 Javaオブジェクトを大文字または小文字の要素を1つ以上含むXML文字列に正しくシリアル化できます。

@Test
public void whenJavaSerializedToXmlFileWithCapitalizedField__thenCorrect()
  throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    xmlMapper.writeValue(new File("target/simple__bean__capitalized.xml"),
      new SimpleBeanForCapitalizedFields());
    File file = new File("target/simple__bean__capitalized.xml");
    assertNotNull(file);
}

6. 結論

この簡単な記事では、簡単なPOJOをXMLにシリアル化し、基本的なXMLデータからPOJOを取得する方法を説明しました。

この記事に付随するソースコードはhttps://github.com/eugenp/tutorials/tree/master/jackson[GitHub]にあります。