自己閉じ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にマッピングする場合。

試してみる — JSON ↔ XML Converter

フルツールを開く