java - 如何编组 HashMap> 使用 JAXB
问题描述
我正在尝试编组 HashMap> 但 ArrayList 在生成的 xml 中为空。
我尝试了以下代码。
POJO -
@XmlRootElement(name = "crossreference")
@XmlAccessorType(XmlAccessType.FIELD)
public class CrossReference implements Serializable {
private static final long serialVersionUID = 1L;
HashMap<String, ArrayList<String>> testMap = new HashMap<>();
public HashMap<String, ArrayList<String>> getTestMap() {
return testMap;
}
public void setTestMap(HashMap<String, ArrayList<String>> testMap) {
this.testMap = testMap;
}
@Override
public String toString() {
return "CrossReference [testMap=" + testMap + "]";
}
马歇尔的代码,
ArrayList<String> nameList = new ArrayList<>();
nameList.add("Shivling");
nameList.add("Bipin");
nameList.add("Sudhakar");
HashMap<String, ArrayList<String>> testMap = new HashMap<>();
testMap.put("name", nameList);
CrossReference crossReference = new CrossReference();
crossReference.setTestMap(testMap);
JAXBContext context = JAXBContext.newInstance(CrossReference.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // To format XML
StringWriter stringWriter = new StringWriter();
marshaller.marshal(crossReference, stringWriter);
String xml = stringWriter.toString();
System.out.println(xml);
进行编组后的 XML -
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<crossreference>
<testMap>
<entry>
<key>name</key>
<value/>
</entry>
</testMap>
</crossreference>
我不确定为什么上述 XML 中的值为空。请帮我解决这个问题。
我期待具有以下所有名称的 XML,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<crossreference>
<testMap>
<entry>
<key>name</key>
<value>Shivling</value>
<value>Bipin</value>
<value>Sudhakar</value>
</entry>
</testMap>
</crossreference>
解决方案
首先,使用这种结构你不可能有这样的结果,因为Map
只有一个value
. 虽然value
是项目列表,但对于地图,它仍然是一个值。
JAXB 无法处理复杂/嵌套的数据结构,例如Map<String, List<String>>
. 你必须创建一个包装前。WrappedStringList
对于地图的值,即Map<String, WrappedStringList>
。
class WrappedStringList {
private List<String> wrapped;
// getter & setter
}
它将在对象中使用,CrossReference
例如:
@XmlElementWrapper(name = "testMap")
HashMap<String, WrappedStringList> testMap = new HashMap<>();
结果如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<crossreference>
<testMap>
<entry>
<key>name</key>
<value>
<wrapped>Shivling</wrapped>
<wrapped>Bipin</wrapped>
<wrapped>Sudhakar</wrapped>
</value>
</entry>
</testMap>
</crossreference>
推荐阅读
- php - 在每个 curl 请求中重新生成代理
- node.js - 如何在使用 adonis 迁移时更改列类型而不会丢失数据库数据?
- reactjs - SCRIPT1028:SCRIPT1028:预期的标识符、字符串或数字
- presto - Presto:如何使用当前日期和时区指定时间间隔
- c++ - 分配和添加运算符重载(2 个表和 int 的串联)
- git - 读取 git filter-branch 中的文件内容
- python - 如果特定变量的观察值是数字,则从数据框中删除行
- java - 如何转换以厘米为单位的给定长度并将其表示为公里、米和厘米的组合?
- ios - 泛型获取 Firestore 集合
- mysql - 四个表的内部联接不起作用?