我有一个XML,其中包含如下序列化的地图:
<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一起使用?
答案 0 :(得分:2)
您必须使用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
}
然后,当您解组文件时,您将拥有一个包含地图的实体对象。
如果您遇到麻烦,请告诉我,如果此解决方案符合您的需求,那么我可以编辑/追加我的答案。
编辑:
如果您的Entities元素不是您的根元素,那么您可以像这样映射它:
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
}