Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JAXB进行自定义地图解组_Java_Xml_Jaxb - Fatal编程技术网

Java 使用JAXB进行自定义地图解组

Java 使用JAXB进行自定义地图解组,java,xml,jaxb,Java,Xml,Jaxb,我有一个XML,其中包含如下序列化的地图: <system> ... <entities> <entity> <string>key<string> <string><![CDATA[["a", "b", "c"]]]></string> </entity> ... </entities> </system>

我有一个XML,其中包含如下序列化的地图:

<system>
  ...
  <entities>
    <entity>
      <string>key<string>
      <string><![CDATA[["a", "b", "c"]]]></string>
    </entity>
    ...
  </entities>
</system>

所以问题是如何使它与JAXB一起工作?

您必须使用XmlAdapter和@XmlJavaTypeAdapter注释

步骤1:创建一个表示
元素的类实体,并将其映射到JAXB


第2步:创建一个扩展
XMLAdapter的类谢谢,我唯一不能理解的问题是,它不是一个XmlRootElement,而是一个更大对象的成员。我会更新我原来的问题。我更新了答案,它解决了你的问题吗?谢谢,它没有直接解决,但你确实帮助我走上了正确的道路。JAXB不喜欢在同一个属性上使用\@XmlElementWrapper和\@XmlJavaTypeAdapter。我必须为集合创建另一个实体。奇怪的是,包装器和适配器不能一起工作,我会研究它。无论如何,我更新了你可能使用的答案。如果答案正确,你能接受吗?谢谢。请注意,规范允许使用\@XmlElementWrapper和\@XmlJavaTypeAdapter,但JAXB中目前存在一个bug,阻止我们这样做:
class System {
  ...
  private Map<String, Object> properties;
}
@XmlRootElement
@XmlSeeAlso({Entity.class})
@XmlAccessorType(XmlAccessType.FIELD)
public class Entities{

    @XmlElement(name="entity")
    @XmlJavaTypeAdapter(YourAdapter.class)
    private Map<String,Object> yourMap;

    //getters, setters, and methods
}
class ParentElement{

    //Other fields

    @XmlElement(name="entities")
    private Entities entities;

    //Getters, Setters, Methods
}
@XmlSeeAlso({Entity.class})
public class Entities{

    @XmlElement(name="entity")
    @XmlJavaTypeAdapter(YourAdapter.class)
    private Map<String,Object> yourMap;

    //getters, setters, and methods
}