- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
问题是关于 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/
我正在尝试使用 flot 绘制 SQL 数据库中的数据图表,这是使用 php 收集的,然后使用 json 编码的。 目前看起来像: [{"month":"February","data":482},
我有一个来自 php 行的 json 结果,类似于 ["value"]["value"] 我尝试使用内爆函数,但得到的结果是“value”“value” |id_kategori|created_at
脚本 1 将记录 two 但浏览器仍会将 select 元素呈现为 One。该表单还将提交值 one。 脚本 2 将记录、呈现和提交 两个。我希望它们是同义词并做同样的事情。请解释它们为何不同,以及我
我的python字典结构是这样的: ips[host][ip] 每行 ips[host][ip] 看起来像这样: [host, ip, network, mask, broadcast, mac, g
在 C# 中 我正在关注的一本书对设置和获取属性提出了这样的建议: double pri_test; public double Test { get { return pri_test; }
您可能熟悉 enum 位掩码方案,例如: enum Flags { FLAG1 = 0x1, FLAG2 = 0x2, FLAG3 = 0x4, FLAG4 = 0x8
在一些地方我看到了(String)value。在一些地方value.toString() 这两者有什么区别,在什么情况下我需要使用哪一个。 new Long(value) 和 (Long)value
有没有什么时候 var result = !value ? null : value[0]; 不会等同于 var result = value ? value[0] : null; 最佳答案 在此处将
我正在使用扫描仪检测设备。目前,我的条形码的值为 2345345 A1。因此,当我扫描到记事本或文本编辑器时,输出将类似于 2345345 A1,这是正确的条形码值。 问题是: 当我第一次将条形码扫描
我正在读取 C# 中的资源文件并将其转换为 JSON 字符串格式。现在我想将该 JSON 字符串的值转换为键。 例子, [ { "key": "CreateAccount", "text":
我有以下问题: 我有一个数据框,最多可能有 600 万行左右。此数据框中的一列包含某些 ID。 ID NaN NaN D1 D1 D1 NaN D1 D1 NaN NaN NaN NaN D2 NaN
import java.util.*; import java.lang.*; class Main { public static void main (String[] args) thr
我目前正在开发我的应用程序,使其设计基于 Holo 主题。在全局范围内我想做的是工作,但我对文件夹 values、values-v11 和 values-v14. 所以我知道: values 的目标是
我遇到了一个非常奇怪的问题。 我的公司为我们的各种 Assets 使用集中式用户注册网络服务。我们一般通过HttpURLConnection使用请求方法GET向Web服务发送请求,通过qs设置参数。这
查询: UPDATE nominees SET votes = ( SELECT votes FROM nominees WHERE ID =1 ) +1 错误: You can't specify
如果我运行一段代码: obj = {}; obj['number'] = 1; obj['expressionS'] = 'Sin(0.5 * c1)'; obj['c
我正在为我的应用创建一个带有 Twitter 帐户的登录页面。当我构建我的项目时会发生上述错误。 values/strings.xml @dimen/abc_text_size_medium
我在搜索引擎中使用以下 View : CREATE VIEW msr_joined_view AS SELECT table1.id AS msr_id, table1.msr_number, tab
为什么验证会返回此错误。如何解决? ul#navigation li#navigation-3 a.current Value Error : background-position Too
我有一个数据名如下 import pandas as pd d = { 'Name' : ['James', 'John', 'Peter', 'Thomas', 'Jacob', 'Andr
我是一名优秀的程序员,十分优秀!