373.5. 命名空间映射
XML 具有完全限定元素和属性的命名空间;JSON 不.执行 XML-JSON 转换时,您需要考虑到这一点。
为缩小差距,Json-lib 有一个选项来绑定命名空间声明,格式为 prefixs 和 namespace URIs 到 XML 输出元素,同时 unmarshalling (例如从 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 adjust namespace URI]。为了便于映射多个前缀和命名空间 URI,NamespacesPerElementMapping (String 元素, String pipeSeparatedMappings)
构造器采用基于 String 的 pipe- separated 序列 [prefix, namespaceURI] 对: |ns2|http://camel.apache.org/personalData|ns3|http://camel.apache.org/personalData2|
。
要定义 default 命名空间,只需将对应的 key 字段留空: |ns1|http://camel.apache.org/test1||http://camel.apache.org/default|
。
将命名空间声明绑定到元素 name = 空字符串会将这些命名空间附加到 root 元素。
完整代码类似如下:
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. Example
在以下 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 规格定义了 JSON 对象,如下所示:
对象是一组未排序的名称/值对。[…]。
正因如此,元素在输出 XML 中以不同顺序排列。