我有一个 XML,其中包含像这样序列化的 map :
<system>
...
<entities>
<entity>
<string>key<string>
<string><![CDATA[["a", "b", "c"]]]></string>
</entity>
...
</entities>
</system>
我想从中得到的是 <entities>
反序列化为 Map<String, Object>
与 map.get(key)
返回字符串列表。
class System {
...
private Map<String, Object> properties;
}
所以问题是如何让它与 JAXB 一起工作?
最佳答案
您必须使用 XmlAdapter 和 @XmlJavaTypeAdapter 注释。
第 1 步:创建一个代表您的 <entity>
的类实体元素并使用 JAXB 映射它。
第 2 步:创建一个扩展 XmlAdapter<List<Entity>,Map<String,Object>
的类并定义抽象方法 marshall 和 unmarshall。
第 3 步:创建一个类实体,如下所示:
@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
}
然后,当您解码文件时,您将拥有一个包含 map 的 Entities 对象。
如果您遇到问题,请告诉我这个解决方案是否适合您的需求,以便我可以编辑/附加我的答案。
EDIT :
如果您的实体元素不是根元素,那么您可以像这样映射它:
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
}
关于java - 使用 JAXB 自定义 map 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38053583/