JSON⇔XML変換の仕組みと変換規則|属性@_・#text・配列化まで
公開日:2026年9月23日 更新日:2026年9月15日 運営:シルギア(Analyzegear, Inc.) 対象ツール:JSON⇔XML変換
APIのレスポンスや設定ファイルを扱っていると、JSONで受け取ったデータをXMLに直したい、あるいはその逆をしたい場面があります。ところがこの2つはデータの持ち方(構造モデル)が違うため、単純に置き換えるだけでは往復できません。このツールは、外部ライブラリを使わずブラウザ内だけで両者を相互変換します。ここでは、どんな規則で橋渡ししているのか、なぜ数値が文字列になるのか、どう使えば意図どおりに変換できるのかを、実際の入出力で確かめながら解説します。
JSONとXMLは構造モデルが違う
JSONは、オブジェクト(キーと値の集まり)・配列・文字列・数値・真偽値・nullという明確な型を持ちます。値そのものに型があるのが特徴で、1980は数値、"1980"は文字列として区別されます。
一方XMLは、要素(タグ)・属性・テキストという3つの部品だけでできています。値の型という概念が無く、タグの中身はすべてテキストです。また、XMLには「配列」という専用の仕組みがなく、同じ意味のデータを並べたいときは同名タグを繰り返します。この構造の違いこそが、変換に規則が必要になる理由です。両者を機械的に往復させるには、JSONの型・配列・キーを、XMLの要素・属性・テキストにどう対応づけるかを決めておく必要があります。
JSON→XMLの変換規則
JSONからXMLへは、次の規則で書き出します。
- オブジェクトのキーは、そのまま要素名(タグ名)になります。
- 配列は、同じ名前の要素を並べた繰り返しになります。
- 文字列・数値などのスカラー値は、要素のテキストになります。
- キーが@_で始まる項目(例: @_id)は、要素の属性として書き出します。
- #textキーの値は、その要素のテキストになります。属性とテキストを1つの要素に同居させたいときに使います。
ルート要素名の決め方には約束があります。最上位がキー1つだけのオブジェクトのときは、そのキー名がそのままルート要素名になり、指定したルート名の欄は無視されます。複数キーのオブジェクトや配列、単独の値のときは、指定したルート要素名(既定はroot)で全体を包みます。なお、XMLの要素名には空白や多くの記号が使えず、先頭に数字も置けないため、使えない文字は自動的に_に置き換え、必要に応じて先頭に_を補います。
XML→JSONの変換規則とDOMParser
XMLからJSONへは、ブラウザ標準のDOMParserで解析します。入力文字列をtext/xmlとして読み込み、木構造(DOM)に組み立ててから、要素をたどってJSONへ組み替えます。自前で文字を1つずつ読む代わりに、ブラウザに備わった正式なXMLパーサを使うので、入れ子や属性の解釈が標準どおりになり、構文が壊れていればその場所を含むエラーが返ります。
組み替えの規則はJSON→XMLの裏返しです。要素はオブジェクトになり、属性は@_属性名、テキストノードは#textというキーで表します。ただしテキストだけを持つ要素は文字列に短縮します。たとえば<b>1</b>は{"b":{"#text":"1"}}ではなく、単に"1"になります。そして同じ名前の子要素が複数あるときは配列にまとめます。ルート要素の名前が、そのまま最上位のキーになります。
なぜ数値が文字列になるのか
XML→JSONで最も戸惑いやすいのが、数値が文字列になる点です。<price>1980</price>を変換すると、1980ではなく"1980"になります。これは前述のとおり、XMLに型が無く要素の中身がすべてテキストだからです。パーサから見れば、1980という文字の並びが数値なのか商品コードなのか判別する手がかりがありません。誤って推測して数値化すると、先頭が0の郵便番号や電話番号が壊れる事故につながります。そこでこのツールは推測をせず、すべて文字列のまま出力します。数値として扱いたい場合は、変換後に利用側のコードで数値化してください。同じ理由で、真偽値やnullも文字列として現れます。
変換例で確かめる
実際の入出力で規則を確認します。まず{"root":{"item":[1,2],"name":"x"}}をXMLにすると、最上位がキー1つ(root)のオブジェクトなのでrootがルート要素になり、配列itemは同名要素の繰り返しになって、次の結果が得られます。
- <root><item>1</item><item>2</item><name>x</name></root>
これを再びJSONに戻すと、2つの<item>が配列にまとまり、数値は文字列化されて{"root":{"item":["1","2"],"name":"x"}}になります。ルート名・配列・要素名という主要な構造は保たれ、変わったのは数値が文字列になった点だけです。次に、テキストだけの入れ子<a><b>1</b></a>をJSON化すると、テキストのみの<b>が文字列に短縮され、{"a":{"b":"1"}}になります。属性とテキストの同居も試せます。<note lang="ja">在庫あり</note>は{"note":{"@_lang":"ja","#text":"在庫あり"}}になり、逆向きも同じ形で往復します。
使いどころと注意点
このツールが役立つのは、XMLで届く古いシステムのデータをJSONで扱いたいとき、逆にJSON中心の環境でXMLの設定を組み立てたいとき、あるいは属性や入れ子の構造を目で確かめたいときです。インデントはスペース2・4・タブ・最小化(1行)から選べ、XML宣言の付与も切り替えられるので、設定ファイルに貼れる形へ整えられます。すべてブラウザ内で処理し入力はどこにも送信されないため、業務データでも安心して試せます。
注意したいのは、往復(ラウンドトリップ)が完全ではない点です。前述のとおり数値・真偽値は文字列になり、要素名に使えない文字を含むキーは_に置き換わります。厳密に元へ戻したい場合は、要素名に使える文字だけをキーにし、型は利用側で復元する前提で設計してください。まずは「サンプルを入れる」で属性・配列・テキストを含む例を変換し、@_と#textの対応や配列化の挙動を確かめてから、実データに進めると安全です。