自己閉じXMLタグと空要素
自己閉じXMLタグと空要素がJSON変換でどのように処理されるかを学びます。nullマッピング、空文字列vsNull、区別の保持方法を解説します。
XML Features
詳細な説明
自己閉じタグ(空要素)はXMLではコンテンツを持たない要素を表します。開始タグと終了タグの間に何もないペアの省略形であり、JSONマッピングには慎重な検討が必要です。
自己閉じタグを持つXML:
<user>
<name>Alice</name>
<email>alice@example.com</email>
<phone/>
<avatar></avatar>
<bio/>
<settings enabled="true"/>
</user>
注:<phone/> と <phone></phone> はXMLでは意味的に同一です。
JSON変換のオプション:
オプション1:nullにマッピング
{
"user": {
"name": "Alice",
"email": "alice@example.com",
"phone": null,
"avatar": null,
"bio": null,
"settings": { "@enabled": "true" }
}
}
オプション2:空文字列にマッピング
{
"user": {
"phone": "",
"avatar": "",
"settings": { "@enabled": "true" }
}
}
オプション3:空オブジェクトにマッピング
{
"user": {
"phone": {},
"settings": { "@enabled": "true" }
}
}
どのオプションを選ぶか:
| シナリオ | 最適なマッピング | 理由 |
|---|---|---|
| フィールドがオプション/不在 | null |
「値なし」を意味的に表現 |
| フィールドがテキストを期待するが空 | "" |
空コンテンツでフィールドを保持 |
| 要素が属性を持つ可能性あり | {} |
コンテンツと並んで属性キーを許可 |
| 属性のみの要素 | { "@attr": "val" } |
属性データを保持 |
属性を持つ自己閉じタグは特殊なケースです。<settings enabled="true"/> にはテキストコンテンツがありませんが、属性があります。
JSONからXMLに変換する場合:
| JSON値 | XML出力 |
|---|---|
null |
<field/> または <field xsi:nil="true"/> |
"" |
<field></field> または <field/> |
{} |
<field/> |
JSONのnull、空文字列、空オブジェクトの区別は、XMLではすべて同じ自己閉じタグに集約されます。これはラウンドトリップ変換で情報が失われる領域の一つです。
ベストプラクティス: XMLからJSONに変換する際、消費側コードが特に空文字列を必要としない限り、空要素には null を使用してください。消費者がnull値をどう解釈するかわかるよう規約を文書化してください。
ユースケース
電話番号やアバターURLなどのオプションフィールドが値なしを示すために自己閉じタグを使用するユーザープロファイルXMLドキュメントをパースし、REST APIレスポンス用のJSON表現でnullにマッピングする場合。