4

Jackson を使用して XML にシリアル化するときに問題が発生しているようです。私のコードは以下の通りです:

テストコンテナ

package com.test;

import java.util.ArrayList;

import com.fasterxml.jackson.annotation.JsonProperty;

public class TestContainer {

    private String testContainerID;
    private String testContainerMessage;
    private ArrayList<TestChild> testContainerChildren;

    @JsonProperty("TestContainerID")
    public String getTestContainerID() {
        return testContainerID;
    }

    @JsonProperty("TestContainerID")
    public void setTestContainerID(String testContainerID) {
        this.testContainerID = testContainerID;
    }

    @JsonProperty("TestContainerMessage")
    public String getTestContainerMessage() {
        return testContainerMessage;
    }

    @JsonProperty("TestContainerMessage")
    public void setTestContainerMessage(String testContainerMessage) {
        this.testContainerMessage = testContainerMessage;
    }

    @JsonProperty("TestContainerChildren")
    public ArrayList<TestChild> getTestContainerChildren() {
        return testContainerChildren;
    }

    @JsonProperty("TestContainerChildren")
    public void setTestContainerChildren(ArrayList<TestChild> testContainerChildren) {
        this.testContainerChildren = testContainerChildren;
    }

}

テスチャイルド

package com.test;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;

@JsonRootName(value="TestChild")
public class TestChild {

    private String testChildID;
    private String testChildMessage;

    @JsonProperty("TestChildID")
    public String getTestChildID() {
        return testChildID;
    }

    @JsonProperty("TestChildID")
    public void setTestChildID(String testChildID) {
        this.testChildID = testChildID;
    }

    @JsonProperty("TestChildMessage")
    public String getTestChildMessage() {
        return testChildMessage;
    }

    @JsonProperty("TestChildMessage")
    public void setTestChildMessage(String testChildMessage) {
        this.testChildMessage = testChildMessage;
    }

}

使用する

  • シリアライゼーション:

    XmlMapper xm = 新しい XmlMapper(); TestContainer tc = xm.readValue(sb.toString(), TestContainer.class);

  • 逆シリアル化:

    System.out.println(xm.writeValueAsString(tc)); tc = xm.readValue(sb.toString(), TestContainer.class);

私がやっていることは、クラスパス上のフォルダーから XML ファイルをロードし、ファイルの内容を StringBuffer に入れることです。問題は、オブジェクトのコレクション用に生成された XML です。XML を記述するときは、次のようなものが必要です。

<TestContainerChildren><TestChild><...(Element Details)...></TestChild></TestContainerChildren>

しかし、私は得ています:

<TestContainerChildren><TestContainerChildren><...(Element Details)...><TestContainerChildren></TestContainerChildren>

ここで何が欠けているのかわかりません。シリアライゼーション/デシリアライゼーションの JSON 部分には問題がなく、XML だけです。Jackson と JAXB の両方のアノテーションを使用してラッピングをオフにしようとしましたが、次のアノテーションを使用してみました。

  • @JsonRootName
  • @JsonProperty
  • @ジャクソンXmlElementWrapper
  • @ジャクソン要素
  • @XmlElementWrapper
  • @XmlElement

これは私の側ではばかげていると確信していますが、どんな助けでも大歓迎です。

4

2 に答える 2

3

変数宣言の上に次の注釈を使用して、これを機能させました。

  • @JacksonXmlElementWrapper(localName="[コレクション名を挿入]")
  • @JacksonXmlProperty(localName="[コレクション要素名を挿入]")

ここに記載されているように、これは RTFM の単純なケースです。

于 2013-08-30T21:56:49.450 に答える
3

わかりました、メモをいくつか。まず、@JsonRootName名前が示すように、XML ドキュメントのルートに使用される名前にのみ影響します。したがって、 には使用されませんTestChild。第二に、リスト要素を含むプロパティの要素を省略して、いわゆる「ラップされていない」出力をリストに使用したいようです。これは次の方法で実行できます。

@JacksonXmlElementWrapper(useWrapping=false)
@JsonProperty("TestContainerChildren")
public ArrayList<TestChild> getTestContainerChildren() { ... }

デフォルト設定はラッパーを使用するためです (これは、アンラップがデフォルトである JAXB とは異なります)。または、これをグローバルに変更して、ラップされていないことをデフォルトとして想定する場合は、次の方法でデフォルトを変更できますXmlModule

JacksonXmlModule module = new JacksonXmlModule();
// to default to using "unwrapped" Lists:
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);

お役に立てれば!

于 2013-08-05T22:42:41.263 に答える