JAXB:如何将映射编组到 <key>value</key> [英] JAXB: how to marshall map into <key>value</key>
问题描述
问题是关于 JAXB Map 编组 - 有很多关于如何将 Map 编组成如下结构的示例:
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 开发人员推荐的方式成功实现我的 Map 适配器 (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/
这篇关于JAXB:如何将映射编组到 <key>value</key>的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!