Java 使用Moxy处理动态元素名称

Java 使用Moxy处理动态元素名称,java,json,jaxb,moxy,Java,Json,Jaxb,Moxy,我需要对我的对象FileDocument进行绑定,其中包含对另一个对象元数据的引用。我希望元数据可以根据其属性上的值具有动态名称 我听说并使用过XmlAdapter(也用于元数据类),但仅限于Map案例。我真的不明白如何让它在这个案子中起作用 FileDocument的代码段: @XmlAccessorType(XmlAccessType.FIELD) public class FileDocument{ //... protected List<Metadata> metadat

我需要对我的对象FileDocument进行绑定,其中包含对另一个对象元数据的引用。我希望元数据可以根据其属性上的值具有动态名称

我听说并使用过XmlAdapter(也用于元数据类),但仅限于Map案例。我真的不明白如何让它在这个案子中起作用

FileDocument的代码段:

@XmlAccessorType(XmlAccessType.FIELD)
public class FileDocument{
//...
 protected List<Metadata> metadata;
//...
}
您可以将的
@XmlVariableNode
扩展用于此用例:

Java模型 文件文档

{
   "metadata.source1" : {
   },
   "metadata.source2" : {
   }
}
我们将在
元数据
字段上使用
@XmlVariableNode
注释。这告诉MOXy,与其为元素/键使用固定名称,不如从引用对象上的指定字段/属性中获取名称

import java.util.List;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlVariableNode;

@XmlAccessorType(XmlAccessType.FIELD)
public class FileDocument {

    @XmlVariableNode("source")
    protected List<Metadata> metadata;

}
演示代码 您可以运行下面的演示代码,看看一切正常

演示

import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(2);
        properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
        properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {FileDocument.class}, properties);


        Metadata m1 = new Metadata();
        m1.source = "metadata.source1";

        Metadata m2 = new Metadata();
        m2.source = "metadata.source2";

        List<Metadata> metadata = new ArrayList<Metadata>();
        metadata.add(m1);
        metadata.add(m2);

        FileDocument fd = new FileDocument();
        fd.metadata = metadata;

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(fd, System.out);
    }

}
更多信息 您可以在我的博客上阅读更多关于
@XmlVariableNode
扩展的信息:


不错!我想我必须求助于映射元数据,并为此制作一个XmlAdapter。非常感谢!
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Metadata {

    @XmlTransient
    String source;

}
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(2);
        properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
        properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {FileDocument.class}, properties);


        Metadata m1 = new Metadata();
        m1.source = "metadata.source1";

        Metadata m2 = new Metadata();
        m2.source = "metadata.source2";

        List<Metadata> metadata = new ArrayList<Metadata>();
        metadata.add(m1);
        metadata.add(m2);

        FileDocument fd = new FileDocument();
        fd.metadata = metadata;

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(fd, System.out);
    }

}
{
   "metadata.source1" : {
   },
   "metadata.source2" : {
   }
}