JAXB:如何将映射编组为 <key>value</key>
问题是关于 JAXB 地图编组 - 有很多关于如何将地图编组为如下结构的示例:
The question is about JAXB Map marshalling - there is plenty of examples on how to marhsall a Map into a structure like follows:
<map>
<entry>
<key> KEY </key>
<value> VALUE </value>
</entry>
<entry>
<key> KEY2 </key>
<value> VALUE2 </value>
</entry>
<entry>
...
</map>
事实上,JAXB 本身就支持这一点.然而,我需要的是 XML,其中 key 是元素名称,value 是它的内容:
In fact, this is natively supported by JAXB. What I need, however, is the XML where key is the element name, and value is its content:
<map>
<key> VALUE </key>
<key2> VALUE2 </key2>
...
</map>
我没有按照 JAXB 开发人员推荐的方式成功实现我的地图适配器 (https://jaxb.dev.java.net/guide/Mapping_your_favorite_class.html),根据我的需要,他-动态属性名称:)
I didn't succeed implementing my Map adapter the way it is recommended by JAXB developers (https://jaxb.dev.java.net/guide/Mapping_your_favorite_class.html), as I need, he - dynamic attribute name :)
有什么解决办法吗?
附:目前,我必须为要编组为 XML 的每组典型的键值对创建一个专用的容器类 - 它可以工作,但我必须创建太多的这些帮助容器.
P.S. Currently I have to create a dedicated container class for each typical set of key-value pairs I want to marshall to XML - it works, but I have to create way too many of these helper containers.
推荐答案
提供的代码对我不起作用.我找到了另一种地图方式:
the code provided didn't work for me. I found another way to Map :
地图元素:
package com.cellfish.mediadb.rest.lucene;
import javax.xml.bind.annotation.XmlElement;
class MapElements
{
@XmlElement public String key;
@XmlElement public Integer value;
private MapElements() {} //Required by JAXB
public MapElements(String key, Integer value)
{
this.key = key;
this.value = value;
}
}
地图适配器:
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.annotation.adapters.XmlAdapter;
class MapAdapter extends XmlAdapter<MapElements[], Map<String, Integer>> {
public MapElements[] marshal(Map<String, Integer> arg0) throws Exception {
MapElements[] mapElements = new MapElements[arg0.size()];
int i = 0;
for (Map.Entry<String, Integer> entry : arg0.entrySet())
mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
return mapElements;
}
public Map<String, Integer> unmarshal(MapElements[] arg0) throws Exception {
Map<String, Integer> r = new HashMap<String, Integer>();
for (MapElements mapelement : arg0)
r.put(mapelement.key, mapelement.value);
return r;
}
}
根元素:
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
public class Root {
private Map<String, Integer> mapProperty;
public Root() {
mapProperty = new HashMap<String, Integer>();
}
@XmlJavaTypeAdapter(MapAdapter.class)
public Map<String, Integer> getMapProperty() {
return mapProperty;
}
public void setMapProperty(Map<String, Integer> map) {
this.mapProperty = map;
}
}
我在这个网站上找到了代码:http://www.developpez.net/forums/d972324/java/general-java/xml/hashmap-jaxb/
I found the code in this website : http://www.developpez.net/forums/d972324/java/general-java/xml/hashmap-jaxb/
相关文章