372.5. 命名空间映射
XML 具有命名空间,可以完全符合元素和属性;JSON 不。执行 XML-JSON 转换时,您需要考虑这一点。
要缩小差距,Json-lib 具有一个选项,可将命名空间声明(以前缀和命名空间 URI 的形式)绑定为 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 misconfiguration 命名空间 URI]。为便于映射多个前缀和命名空间 URI,NamespacesPerElementMapping (String element, String pipeSeparatedMappings)
构造器采用基于字符串的管道序列 [prefix, namespaceURI] 对: |ns2|http://camel.apache.org/personalData|ns3|http://camel.apache.org/personalData2|
。
要定义默认命名空间,只需将对应的键字段留空: |ns1|http://camel.apache.org/test1||http://camel.apache.org/default|
。
将命名空间声明绑定到元素 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 中实现相同的功能。
372.5.1. 示例
在以上 Java 代码段中使用以下 JSON 字符串中的命名空间绑定:
{ "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 中以不同顺序排列的原因。