2016-06-27 61 views
1

解組我有一個包含地圖連載像這樣的XML:自定義地圖與JAXB

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

我想從這個得到的是,<entities>被deserialised爲Map<String, Object>map.get(key)返回一個字符串列表。

class System { 
    ... 
    private Map<String, Object> properties; 
} 

所以問題是如何使它與JAXB一起工作?

回答

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 
} 

然後,當你解組文件,你就會有一個實體對象,其中包含您的地圖。

如果您遇到問題,請告訴我,如果此解決方案確實符合您的需求,那麼我可以編輯/追加我的答案。

編輯:

如果你的實體因素是不是你的根元素,那麼你可以這樣映射它:

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 
} 
+0

謝謝,我不能包裹頭的唯一問題是不是XmlRootElement,而只是一個更大對象的成員。我會更新我原來的問題。 – vasily

+0

我更新了答案,它能解決您的問題嗎? –

+0

謝謝,它並不直接,但你肯定幫助我走上了正確的軌道。 JAXB不喜歡\ @XmlElementWrapper和\ @XmlJavaTypeAdapter在同一個屬性上。我不得不創建另一個實體進行收集。 – vasily