我的JAXB对象模型的实例包含一个属性,该属性在为该实例生成Xml时需要输出,而在生成json时不希望输出
即我想要
<release-group type="Album"> <title>Fred</title> </release-group>
和
"release-group" : { "title" : "fred", },
但是有
"release-group" : { "type" : "Album", "title" : "fred" },
我可以使用oxml.xml映射文件来执行此操作吗
由于您的JSON绑定与XML绑定略有不同,因此我将使用 EclipseLink JAXB(MOXy) 的外部映射文件。
oxm.xml
在外部映射文件中,我们会将type字段标记为瞬态。
type
<?xml version="1.0"?> <xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="forum383861"> <java-types> <java-type name="ReleaseGroup"> <java-attributes> <xml-transient java-attribute="type"/> </java-attributes> </java-type> </java-types> </xml-bindings>
发布组
以下是本示例将使用的域模型。请注意该type属性是如何用注释的@XmlAttribute。
@XmlAttribute
package forum383861; import javax.xml.bind.annotation.*; @XmlRootElement(name="release-group") @XmlAccessorType(XmlAccessType.FIELD) public class ReleaseGroup { @XmlAttribute String type; String title; }
jaxb.properties
要将MOXy指定为JAXB提供程序,您需要jaxb.properties在与域模型相同的程序包中包含一个名为的文件,并包含以下条目(请参阅:http : //blog.bdoughan.com/2011/05/specifying- eclipselink-moxy-as -your.html)。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示版
由于XML和JSON表示形式不同,因此我们将为其分别创建JAXBContexts。对于JSON,我们将利用MOXy的外部映射文件。
JAXBContexts
package forum383861; import java.util.*; import javax.xml.bind.*; import org.eclipse.persistence.jaxb.JAXBContextProperties; public class Demo { public static void main(String[] args) throws Exception { ReleaseGroup rg = new ReleaseGroup(); rg.type = "Album"; rg.title = "Fred"; // XML JAXBContext xmlJC = JAXBContext.newInstance(ReleaseGroup.class); Marshaller xmlMarshaller = xmlJC.createMarshaller(); xmlMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); xmlMarshaller.marshal(rg, System.out); // JSON Map<String, Object> properties = new HashMap<String, Object>(2); properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum383861/oxm.xml"); properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json"); JAXBContext jsonJC = JAXBContext.newInstance(new Class[] {ReleaseGroup.class}, properties); Marshaller jsonMarshaller = jsonJC.createMarshaller(); jsonMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jsonMarshaller.marshal(rg, System.out); } }
输出量
以下是运行演示代码的输出:
<?xml version="1.0" encoding="UTF-8"?> <release-group type="Album"> <title>Fred</title> </release-group> { "release-group" : { "title" : "Fred" } }