![](/img/trans.png)
[英]How to Marshall HashMap<String, ArrayList<String>> using JAXB
[英]JAXB Marshall Map<Integer, ArrayList<String>>
我有一個我想要編組的對象。
@XmlRootElement
public class BoxItem {
@XmlElement
Map<Integer, ArrayList<String>> intgerStringArrMap;
BoxItem() {
intgerStringArrMap = new HashMap<Integer, ArrayList<String>>();
for (int i = 0; i < 3; i++) {
ArrayList<String> stringArrayList = new ArrayList<String>();
for (int j = 0; j < 10; j++) {
stringArrayList.add(new BigInteger(130, new SecureRandom()).toString(32));
}
intgerStringArrMap.put(i, stringArrayList);
}
}
}
現在讓我們假設我們有一個boxItem = new BoxItem()
如果我調用jaxbMarshaller.marshal(boxItem,System.out);,則每個條目的值都為空。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<boxItem>
<intgerStringArrMap>
<entry>
<key>0</key>
<value/>
</entry>
<entry>
<key>1</key>
<value/>
</entry>
<entry>
<key>2</key>
<value/>
</entry>
</intgerStringArrMap>
</boxItem>
如何在Map值中對ArrayList中的元素進行編組?
您應該使用@XmlElementWrapper Annotation。它們用於圍繞Collections
生成包裝器XML元素
為ArrayList
定義一個包裝器,如下所示,
class ListWrapper {
@XmlElementWrapper(name = "wrapperList")
private List<String> list;
public void setList(List<String> list) {
this.list = list;
}
}
在BoxItem
類中定義如下地圖,
@XmlElementWrapper(name = "integerMap")
Map<Integer, ListWrapper> intgerStringArrMap;
這是完整的課程。
@XmlRootElement
public class BoxItem {
@XmlElementWrapper(name = "integerMap")
Map<Integer, ListWrapper> intgerStringArrMap;
BoxItem() {
intgerStringArrMap = new HashMap<Integer, ListWrapper>();
for (int i = 0; i < 2; i++) {
ArrayList<String> stringArrayList = new ArrayList<String>();
ListWrapper wrapper = new ListWrapper();
wrapper.setList(stringArrayList);
for (int j = 0; j < 2; j++) {
stringArrayList.add("2");
}
intgerStringArrMap.put(i, wrapper);
}
}
public static void main(String[] args) throws JAXBException {
BoxItem box = new BoxItem();
JAXBContext jc = JAXBContext.newInstance(BoxItem.class);
jc.createMarshaller().marshal(box, System.out);
}
}
class ListWrapper {
@XmlElementWrapper(name = "wrapperList")
private List<String> list;
public void setList(List<String> list) {
this.list = list;
}
}
運行以上應該得到以下輸出,
<boxItem>
<integerMap>
<entry>
<key>0</key>
<value>
<wrapperList>
<list>2</list>
<list>2</list>
</wrapperList>
</value>
</entry>
<entry>
<key>1</key>
<value>
<wrapperList>
<list>2</list>
<list>2</list>
</wrapperList>
</value>
</entry>
</integerMap>
</boxItem>
Jayamohan的答案是有效的,也許是首選的解決方案,但是如果您曾經不想修改RootElement類(BoxItem),您可以編寫自己的XmlAdapter
以便JAXB知道如何處理Map<Integer, ArrayList<String>>
。
請參閱如何使用JAXB編寫Map <String,List <Objects >>來編寫自己的XmlAdapter
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.