373.5. 命名空间映射
XML 具有具有完全合格的元素和属性的命名空间;JSON 没有。执行 XML-JSON 转换时,您需要考虑这一点。
为缩小差距,Json-lib 有一个选项,可以将前缀和命名空间 URI 形式的 namespace 声明绑定到 XML 输出元素,同时将来自 JSON 转换为 XML。例如,提供以下 JSON 字符串:
{ "pref1:a": "value1", "pref2:b": "value2" }
您可以要求 Json-lib 在元素 pref1:a
和 pref2:b
上输出命名空间声明,以将前缀 pref1
和 pref2
绑定到特定的命名空间 URI。
若要使用此功能,只需创建 XmlJsonDataFormat.NamespacesPerElementMapping
对象,并将它们添加到 namespaceMappings
选项(这是 List
)。
XmlJsonDataFormat.NamespacesPerElementMapping
包含元素名称和映射的 [prefix TOKEN 命名空间 URI]。为便于映射多个前缀和命名空间 URI,NamespacesPerElementMapping (String 元素, String pipeSeparatedMappings)
constructor 采用基于 String 的管道和命名空间 URI 序列 [prefix, namespaceURI] 对: |ns2|http://camel.apache.org/personalData|ns3|http://camel.apache.org/personalData2|
。
要定义 default 命名空间,请只将对应的键字段留空: |ns1|http://camel.apache.org/test1||http://camel.apache.org/default|
。
将 namespace 声明绑定到元素 name = 空字符串会将这些命名空间附加到根元素。
完整代码类似如下:
XmlJsonDataFormat namespacesFormat = new XmlJsonDataFormat(); List<XmlJsonDataFormat.NamespacesPerElementMapping> namespaces = new ArrayList<XmlJsonDataFormat.NamespacesPerElementMapping>(); namespaces.add(new XmlJsonDataFormat. NamespacesPerElementMapping("", "|ns1|http://camel.apache.org/test1||http://camel.apache.org/default|")); namespaces.add(new XmlJsonDataFormat. NamespacesPerElementMapping("surname", "|ns2|http://camel.apache.org/personalData|" + "ns3|http://camel.apache.org/personalData2|")); namespacesFormat.setNamespaceMappings(namespaces); namespacesFormat.setRootElement("person");
在 Spring DSL 中,您可以实现相同的功能。
373.5.1. 示例
在以下 JSON 字符串的 Java 片断中使用命名空间绑定:
{ "name": "Raul", "surname": "Kripalani", "f": true, "g": null}
将生成以下 XML:
<person xmlns="http://camel.apache.org/default" xmlns:ns1="http://camel.apache.org/test1"> <f>true</f> <g null="true"/> <name>Raul</name> <surname xmlns:ns2="http://camel.apache.org/personalData" xmlns:ns3="http://camel.apache.org/personalData2">Kripalani</surname> </person>
请记住,JSON spec 定义 JSON 对象,如下所示:
对象是未排序的名称/值对集合。[…]。
这就是为什么元素在输出 XML 中处于不同顺序的原因。