gpt4 book ai didi

java - JAXB:如何将映射编码为 value

转载 作者:IT老高 更新时间:2023-10-28 13:52:51 25 4
gpt4 key购买 nike

问题是关于 JAXB map 编码 - 有很多关于如何将 map 编码为如下结构的示例:

<map>
<entry>
<key> KEY </key>
<value> VALUE </value>
</entry>
<entry>
<key> KEY2 </key>
<value> VALUE2 </value>
</entry>
<entry>
...
</map>

事实上,JAXB 本身就支持这一点。然而,我需要的是 XML,其中 key 是元素名称,value 是它的内容:

<map>
<key> VALUE </key>
<key2> VALUE2 </key2>
...
</map>

我没有按照 JAXB 开发人员 (https://jaxb.dev.java.net/guide/Mapping_your_favorite_class.html) 推荐的方式成功实现我的 Map 适配器,因为我需要,他 - 动态属性名称 :)

有什么解决办法吗?

附:目前,我必须为要编码为 XML 的每组典型的键值对创建一个专用的容器类 - 它可以工作,但我必须创建太多的这些帮助容器。

最佳答案

您想要这样做可能是有正当理由的,但通常最好避免生成这种 XML。为什么?因为这意味着 map 的 XML 元素依赖于 map 的运行时内容。由于 XML 通常用作外部接口(interface)或接口(interface)层,因此这是不可取的。让我解释一下。

Xml Schema (xsd) 定义了 XML 文档的接口(interface)契约。除了能够从 XSD 生成代码之外,JAXB 还可以从代码中为您生成 XML 模式。这允许您将通过接口(interface)交换的数据限制为 XSD 中定义的预先约定的结构。

Map<String, String> 的默认情况下,生成的 XSD 将限制 map 元素包含多个条目元素,每个条目元素必须包含一个 xs:string key 和一把xs:string值(value)。这是一个非常清晰的接口(interface)契约。

您所描述的是您希望 xml 映射包含其名称将由运行时映射的内容确定的元素。那么生成的 XSD 只能指定 map 必须包含一个在编译时类型未知的元素列表。这是您在定义接口(interface)契约时通常应该避免的事情。

在这种情况下,要实现严格的契约,您应该使用枚举类型作为映射的键,而不是字符串。例如

public enum KeyType {
KEY, KEY2;
}

@XmlJavaTypeAdapter(MapAdapter.class)
Map<KeyType , String> mapProperty;

这样,您希望成为 XML 中的元素的键在编译时是已知的,因此 JAXB 应该能够生成一个模式,该模式将使用预定义的键 KEY 或 KEY2 之一将映射元素限制为元素。

另一方面,如果你想简化默认生成的结构

<map>
<entry>
<key>KEY</key>
<value>VALUE</value>
</entry>
<entry>
<key>KEY2</key>
<value>VALUE2</value>
</entry>
</map>

像这样更简单的东西

<map>
<item key="KEY" value="VALUE"/>
<item key="KEY2" value="VALUE2"/>
</map>

您可以使用 MapAdapter 将 Map 转换为 MapElements 数组,如下所示:

class MapElements {
@XmlAttribute
public String key;
@XmlAttribute
public String value;

private MapElements() {
} //Required by JAXB

public MapElements(String key, String value) {
this.key = key;
this.value = value;
}
}


public class MapAdapter extends XmlAdapter<MapElements[], Map<String, String>> {
public MapAdapter() {
}

public MapElements[] marshal(Map<String, String> arg0) throws Exception {
MapElements[] mapElements = new MapElements[arg0.size()];
int i = 0;
for (Map.Entry<String, String> entry : arg0.entrySet())
mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());

return mapElements;
}

public Map<String, String> unmarshal(MapElements[] arg0) throws Exception {
Map<String, String> r = new TreeMap<String, String>();
for (MapElements mapelement : arg0)
r.put(mapelement.key, mapelement.value);
return r;
}
}

关于java - JAXB:如何将映射编码为 <key>value</key>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3941479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com