1

値を持つコンテナ オブジェクトを使用してメタデータ構造をモデル化する jaxb オブジェクトがいくつかあります。これは、別のコンテナ オブジェクトまたは単純なオブジェクト (文字列など) である可能性があります。

@XmlRootElement(name = "value")
public class Value 
{

    protected SimpleType type;
    protected Container container;

    @XmlElement
    public SimpleType getType()
    {
        return type;
    }

    public void setType(SimpleType type)
    {
        this.type = type;
    }

    @XmlInverseReference(mappedBy="value")
    @XmlElement
    public Container getContainer()
    {
        return container;
    }

    public void setContainer(Container container)
    {
        this.container = container;
    }
}

@XmlRootElement(name = "container")
public class Container 
{
    protected Value value;

    @XmlElement
    public Value getValue()
    {
        return value;
    }

    public void setValue(Value value)
    {
        this.value = value;
    }
}

@XmlRootElement(name = "type")
@XmlEnum
public enum SimpleType
{
        @XmlEnumValue("String")STRING,
        @XmlEnumValue("Boolean")BOOLEAN,
....etc.
}

XML は問題ないように見えますが、JSON には「コンテナー」属性が重複してしまいます。

        <container>
          <value>
            <container>
              <value>
                <type>String</type>
              </value>
            </container>
          </value>
        </container>

            "container": {
              "value": {
                "container": {
                  "container": {
                    "value": {
                      "type": "STRING"
                    }
                  }
                }
              }
            }

なぜこの違いがあるのですか?

4

2 に答える 2

0

注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。

モデルにMOXyの@XmlInverseReferenceアノテーションがあるので、これがJSONの場合にどのように適用されるかに興味があるかもしれません。

input.xml

あなたの質問から私が言えることから、との間に双方向の関係がある場合、XML表現は次のようになりContainerますValue

<?xml version="1.0" encoding="UTF-8"?>
<container>
    <value>
       <type>String</type>
    </value>
</container>

ドメインモデル

以下は、ドメインモデルをマッピングする方法です。@XmlAccessorType(XmlAccessType.FIELD)例を短くするために、アクセサーメソッドを指定して削除しました。

容器

package forum10706457;

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "container")
@XmlAccessorType(XmlAccessType.FIELD)
public class Container 
{
    protected Value value;

}

価値

package forum10706457;

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;

@XmlAccessorType(XmlAccessType.FIELD)
public class Value 
{

    protected SimpleType type;

    @XmlInverseReference(mappedBy="value")
    protected Container container;

}

SimpleType

package forum10706457;

import javax.xml.bind.annotation.*;

@XmlEnum
public enum SimpleType
{
        @XmlEnumValue("String")STRING,
        @XmlEnumValue("Boolean")BOOLEAN,
}

jaxb.properties

アノテーションは@XmlInverseReferenceMOXy拡張機能であるため、ドメインモデルと同じパッケージにjaxb.propertiesという名前のファイルを追加し、次のエントリを使用してMOXyをJAXBプロバイダーとして指定する必要があります。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

デモ

以下のコードは、XMLドキュメントをロードし、結果のオブジェクトをJSONにマーシャリングする方法を示しています。双方向の関係が設定されているかどうかを確認するためのチェックが行われます。

package forum10706457;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Container.class);

        File xml = new File("src/forum10706457/input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Container container = (Container) unmarshaller.unmarshal(xml);

        System.out.println(container == container.value.container);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(container, System.out);
    }

}

出力

以下は、デモコードの実行からの出力です。@XmlEnumValue("String")STRINGJSON表現でどのように活用されたかに注意してください。

true
{
   "container" : {
      "value" : {
         "type" : "String"
      }
   }
}

詳細については

于 2012-05-30T09:56:40.163 に答える
0

これは、 と の間の循環依存が原因ですValueContainer

アップデート。XML への JAXB マッピング循環参照を参照してください。

UPD2. JsonBackReferenceおよびJsonManagedReferenceを参照してください

于 2012-05-22T17:24:21.283 に答える