XMLからJSONへ

XMLとJSONはデータの表現方法が異なります。XMLには属性と混在コンテンツがあり、JSONにはオブジェクトと配列があります。情報を失わずに変換するには規約が必要です。本ツールでは3つの規約を用意しています。コンパクト(属性を削除)、Badgerfish(属性は@keyの下に、テキストは$の下に格納)、リテラル(すべてのXMLノードを完全な忠実度でJSONオブジェクトに変換)です。対象とするJSON利用側に最適な規約を選んでください。

XMLをJSONに変換する方法

  1. 1

    XMLを貼り付けます

    正しく構成されたすべてのXMLです。ネームスペースは保持されます。

  2. 2

    変換スタイルを選択

    コンパクト、Badgerfish、リテラル(ロスレス)から選べます。

  3. 3

    配列を扱う

    特定の要素を常に配列にするよう指定できます(設定可能)。

  4. 4

    JSON出力をコピー

    整形表示または圧縮形式、お好みで選べます。

3つのスタイルの比較

入力:

<book id="1" lang="en">
  <title>1984</title>
  <author>Orwell</author>
</book>

コンパクト(属性を削除):

{
  "book": {
    "title": "1984",
    "author": "Orwell"
  }
}

Badgerfish(属性は@の下に、テキストは$の下に):

{
  "book": {
    "@id": "1",
    "@lang": "en",
    "title": { "$": "1984" },
    "author": { "$": "Orwell" }
  }
}

リテラル/JsonML風(完全な忠実度):

{
  "book": {
    "@attributes": { "id": "1", "lang": "en" },
    "title": "1984",
    "author": "Orwell"
  }
}

強制配列

XMLには「これは要素が1つだけのリストである」と表現する方法がありません。単一要素のシーケンスはスカラーとまったく同じように見えます。

<items>
  <item>A</item>
</items>

これは{"item": "A"}または{"item": ["A"]}のいずれかにシリアル化されます。このコンバーターでは、要素名を(XPathで)常に配列として指定できるため、下流のJSON利用側が一貫した型を受け取れます。

混在コンテンツ

混在コンテンツ(子要素の間にテキストが入り混じったもの)は、XMLからJSONへの変換で唯一情報が失われる箇所です。

<p>Hello <em>world</em>!</p>

ほとんどのスタイルではテキストを削除するか、まとめてしまいます。リテラルスタイルでは配列を用いて順序を保持します:

{
  "p": {
    "@content": ["Hello ", { "em": "world" }, "!"]
  }
}

型推論

デフォルトでは値は文字列です。「数値/真偽値を解析」をオンにすると、コンバーターは42、3.14、true、falseを対応するJSON型に変換します。注意してください。型変換をオンにするとXML属性のid="007"が7になってしまい、これはおそらく望ましくありません。

どれを選ぶべきか

  • コンパクト: 属性がノイズになる、人間が読みやすいJSONに。
  • Badgerfish: 属性とテキストを子要素と同じ深さに置く必要がある場合に。
  • リテラル: 損失なくXMLに往復変換する必要がある場合に。

よくある質問

要素が1回だけ現れる場合、コンバーターはデフォルトでオブジェクトにします。2回以上現れる場合は配列にします。利用側が1つの形を期待している場合は、配列を強制するオプションを使って一貫させてください。

「名前空間を除去」を有効にしない限り、名前空間の接頭辞はキー(ns:title)に保持されます。宣言そのものはルート要素の@xmlns:ns属性になります。

リテラルモードがロスレスに最も近いですが、要素とテキストの間の混在コンテンツの順序は扱いが難しいです。コンパクトモードでは属性が確実に失われます。Badgerfishは実用的な中間案です。

いいえ。変換処理はブラウザ内で実行されます。

関連ツール

このツールは他の言語でも利用できます