1概要

このチュートリアルでは、Jacksonを使用してXMLメッセージをJSONに変換する方法を説明します。

Jacksonに慣れていない読者は、まずhttps://www.baeldung.com/jackson[the basic]に慣れることを検討してください。


2ジャクソン入門

Jacksonで3つの異なる方法でJSONを解析することを考えることができます。

  • 最初で最も一般的なのは、とデータバインディング



ObjectMapper


** 2番目はツリーデータ構造へのマッピングです。



TreeTraversingParser


そして


JsonNode


** そして三つ目は、トークンによるツリーデータ構造のストリーミングです。

  • 現在、Jacksonは最初の2つのXMLデータもサポートしています。そのため、ある形式から別の形式への変換をJacksonがどのようにして手助けできるかを見てみましょう。


3依存関係

まず、

httpsを追加する必要があります。//search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.fasterxml.jackson.core%22%20AND%20a%3A%22jackson-databind% 22[jackson-databind]

私たちの

pom.xmlへの依存関係

:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.7</version>
</dependency>

このライブラリはデータバインディングAPIを使うことを可能にします。

2番目は__https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.fasterxml.jackson.dataformat%22%20AND%20a%3A%22jackson-dataformat-xml%22[これはJacksonのXMLサポートを追加します。

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


4データバインディング

簡単に言うと、データバインディングは、直列化されたデータを直接Javaオブジェクトにマッピングしたい場合です。

これを調べるために、

Flower



__Color

__propertiesを使ってXMLを定義しましょう。

<Flower>
    <name>Poppy</name>
    <color>RED</color>
    <petals>9</petals>
</Flower>

これは、このJavaの表記法に似ています。

public class Flower {
    private String name;
    private Color color;
    private Integer petals;
   //getters and setters
}

public enum Color { PINK, BLUE, YELLOW, RED; }

  • 最初のステップは、XMLを

    Flower

    インスタンスに解析することです** 。それを行うには、

    ObjectMapper

    と同じXMLの

    XmlMapper

    のインスタンスを作成し、その

    __readValue

    __methodを使用します。

XmlMapper xmlMapper = new XmlMapper();
Flower poppy = xmlMapper.readValue(xml, Flower.class);


  • Flower

    インスタンスを作成したら、それをJSONとして書き出します。

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(poppy);

そして、結果として、私たちはJSONと同等のものを得ます。

{
    "name":"Poppy",
    "color":"RED",
    "petals":9
}


5ツリートラバーサル

私たちが仲介クラスを維持したくない場合や、構造の一部だけを変換したい場合のように、ツリー構造を直接見るとより柔軟性がある場合があります。

ただし、ご存知のように、いくつかのトレードオフがあります。

最初のステップは、データバインディングを使用するときの最初のステップと似ています。

ただし今回は、

readTree

メソッドを使用します。

XmlMapper xmlMapper = new XmlMapper();
JsonNode node = xmlMapper.readTree(xml.getBytes());

これを行うと、予想通り、

JsonNode

に3つの子があります。

name、color、

、および

petals

です。

それから、

__ JsonNode


insteadを送信するだけで、再び

ObjectMapper__を使用できます。

ObjectMapper jsonMapper = new ObjectMapper();
String json = jsonMapper.writeValueAsString(node);

  • 今、結果は私達の最後の例と比較してわずかに異なります:**

{
    "name":"Poppy",
    "color":"RED",
    "petals":"9"
}

  • 慎重に調べると、petals属性が数値ではなく文字列にシリアル化されていることがわかります!



    readTree

    は明示的な定義なしにデータ型を推論しないためです。


5.1. 制限事項

そして、JacksonのXMLツリー走査サポートには一定の制限があります。

  • ** JacksonはObjectとArrayを区別できません。

XMLは、オブジェクトをオブジェクトのリストと区別するためのネイティブ構造を欠いています。Jacksonは、繰り返される要素を単一の値に単純に照合します。

  • ** そして、Jacksonは各XML要素をJSONノードにマッピングしたいので、

混合コンテンツはサポートされていません。**

これらの理由から、https://github.com/FasterXML/jackson-dataformat-xml#known-limitations[公式のJacksonドキュメントは、XMLモデルを解析するためにTreeモデルを使用することを推奨します]


6. メモリ制限

  • さて、これらは両方とも変換を実行するためにXML全体を一度にメモリに入れる必要があるという顕著な欠点を持っています。** Jacksonがツリー構造をトークンとしてストリーミングすることをサポートするまでは、この制約に縛られないでしょう。


    XMLStreamReader

    .

    のようなものを使用して、独自にロールバックすることを検討する必要があります。


7. 結論

このチュートリアルでは、JacksonがXMLデータを読み取り、それをJSONに書き込むためのさまざまな方法について簡単に説明しました。また、サポートされている各アプローチの制限について簡単に説明しました。

いつものように、このチュートリアルに付随する完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/jackson[GitHubで利用可能]です。