372.5. 名前空間のマッピング
XML には、要素と属性を完全に修飾する名前空間があります。JSON はそうではありません。XML-JSON 変換を実行するときは、これを考慮する必要があります。
このギャップを埋めるために、Json-lib には、アンマーシャリング (つまり、JSON から XML への変換) 中に XML 出力要素への接頭辞と名前空間 URI の形式でバインド名前空間宣言を行うオプションがあります。たとえば、次の JSON 文字列を指定します。
{ "pref1:a": "value1", "pref2:b": "value2" }
Json-lib に、要素 pref1:a
および pref2:b
の名前空間宣言をバインドに出力し、接頭辞 pref1
および pref2
を特定の名前空間 URI に出力するように問えます。
この機能を使用するには、単純に XmlJsonDataFormat.NamespacesPerElementMapping
オブジェクトを作成し、それらを namespaceMappings
オプション (List
) に追加します。
XmlJsonDataFormat.NamespacesPerElementMapping
は、要素名と 接頭辞 ⇒ 名前空間 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|
.
名前空間宣言を要素名 = 空の文字列にバインドすると、それらの名前空間がルート要素にアタッチされます。
完全なコードは次のようになります。
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. 例
次の 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 では要素の順序が異なります。