3

在我的 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 重命名属性,但在这种情况下没有属性,所以不确定如何继续。

4

1 回答 1

2

您可以设置一个属性来覆盖 MOXy 的 JSON 编组的默认“值”。此属性是按上下文设置的(或可以按 Marshaller 设置)而不是按映射设置,因此现在将使用“myValueWrapper”而不是所有需要它的映射的默认“值”。

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

或者,您可以通过创建不同的 JAXBContexts 来处理每个属性的问题,这些 JAXBContexts 使用可以指定不同行为的外部绑定文件。为将 name 视为具有 @XmlValue 注释的 XML 创建一个绑定文件,并为将 name 视为具有 @XmlElement 注释的 JSON 创建一个绑定文件。

示例 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);
于 2013-06-05T15:59:28.590 回答