使用Eclipselink Moxy如何将xml内容映射到不同于值的名称?

时间:2013-06-05 05:04:23

标签: eclipselink moxy

在我的Xml中我有:

<alias-list>
   <alias sort-name="Afghan">Afghany</alias>
</alias-list>

json输出为

"aliases" [ {
   "sort-name" : "Afghan",
   value : "Afghany"
} ]

但我希望它是:

"aliases" [ {
   "sort-name" : "Afghan",
   name : "Afghany"
} ]

所以我知道如何使用oxml.xml重命名属性,但在这种情况下没有属性,所以不确定如何继续。

1 个答案:

答案 0 :(得分:2)

您可以设置一个属性来覆盖默认值&#34;值&#34;用于MOXy的JSON编组。此属性是根据上下文设置的(或者可以根据Marshaller设置)而不是按照映射设置,因此&#34; myValueWrapper&#34;现在将使用而不是默认的&#34;值&#34;适用于所有需要的映射。

Map<String, Object> props = new HashMap<String, Object>();
props.put(JAXBContextProperties.JSON_VALUE_WRAPPER, "myValueWrapper");
JAXBContext context = JAXBContext.newInstance(myClasses, props);

或者,您可以通过创建使用可指定不同行为的外部绑定文件的不同JAXBContex来基于每个属性处理此问题。为XML创建一个绑定文件,将名称视为具有@XmlValue批注,并为JSON创建一个绑定文件,该文件将名称视为具有@XmlElement批注。

示例xmlbindings.xml

<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="mypackage.test">
    <java-types>
       <java-type name="Alias">
          <java-attributes>
             <xml-value java-attribute="name"/>
          </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

示例jsonbindings.xml

<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="mypackage.test">
    <java-types>
       <java-type name="Alias">
          <java-attributes>
             <xml-element java-attribute="name" name="name"/>
          </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

要使用绑定文件创建JAXBContext,请执行以下操作:

Map<String, Object> props = new HashMap<String, Object>();
StreamSource ss = new StreamSource(new File("pathtobindings/xmlbindings.xml"));    props.put(JAXBContextProperties.OXM_METADATA_SOURCE, ss);
JAXBContext contextWithXMLBindings = JAXBContext.newInstance(myClasses, props);