メインコンテンツへ移動

JSONとXMLの違い

APIペイロードや、ブラウザやモバイルアプリが扱うものにはJSONを選びましょう:より小さく、型があり、どこでも解析できます。ドキュメント型のデータ、エンタープライズ統合、名前空間や厳格なXSD検証が必要なインターフェースにはXMLを選びましょう。どちらも時代遅れではありません。データの通信経路はJSONが、ドキュメントはXMLが担っており、このページのコンバーターがその両方向を橋渡しします。

端末内で処理

JSONとXMLの違いとは

15年もの間、XMLはほぼすべてのデータに関する問いへの既定の答えでした――SOAPサービス、RSSフィード、Officeドキュメント、ビルド設定などです。その後JSONがAPI層をほぼ完全に奪い、2つのフォーマットはそれ以来、快適な役割分担で共存してきました。「ライバル」という枠組みは本当の話を隠します。つまり、2つは別々の仕事のために作られたということです。XMLはSGMLの子孫で、ドキュメント向けのマークアップ言語です。一方JSONは、文法が1枚のカードに収まるほど小さいデータ交換フォーマットです。どちらかへの不満の大半は、片方にもう片方の仕事をさせようとすることから生まれます。

日々の違いは具体的です。XMLはすべての値を開始タグと終了タグで囲むため、フィールドごとのマークアップ量はほぼ2倍になります。一方JSONは値を引用符とカンマで包みます。XMLは「すべて文字列」の型付けです――スキーマが別を告げるまですべてがテキストです――一方JSONは、数値・ブール値・nullを構文そのものの中で宣言します。XMLには属性、名前空間、混合コンテンツがあります。一方JSONにはキーと配列があり、属性・名前空間・混合コンテンツはどれもありません。こうした設計判断の一つ一つが、スキーマ、ツール、ペイロードサイズに波及します。

このページでは、比較が実際に効いてくる局面――構文とタグのコスト、型付け、スキーマと名前空間、サイズとストリーミング――に絞って扱います。両者をまたぎたいときは、このサイトに両方向のコンバーターがあります。そしてここにあるすべてと同じく、解析も出力も完全にブラウザ内で行われます。

JSONペイロードをXML専用のシステムに渡す必要があるときは、JSONからXMLコンバーターがブラウザ内でキーと配列を要素にマッピングします。アップロードは一切ありません。

レガシーなフィードやSOAPレスポンスを引き継いだときは、XMLからJSONコンバーターが、コードがタグに触れる前にローカルでJSONへ組み替えます。

起源:マークアップ言語とデータフォーマット

XMLの祖先はSGMLで、その設計目標はドキュメント――段落、強調、構造が混ざった文章――をマークアップすることでした。だからこそ、2つのうち混合コンテンツ――<title>Learning <em>XML</em></title> のようなインラインマークアップ入りのテキスト――をサポートするのはXMLだけですし、属性や実体参照、重厚な処理モデルが育ったのもXMLです。JSONは2001年頃にJavaScriptのオブジェクトリテラルから切り出され、目的はただ一つ:可能な限り小さい文法でプログラム間の構造化データを運ぶことでした。JSONに混合コンテンツはなく、実体の仕組みも、ドキュメントツリーもありません――オブジェクト、配列、そして4つのスカラー型がすべてです。

構文:タグのコスト、属性、そして存在しない配列

XMLのすべての要素は開始と終了を持つため、単純な値1つに2つのタグがかかります:<price>19.99</price>。XMLには別の書き方――<price currency="EUR">19.99</price>――もあり、属性にするか要素にするかという選択は、20年間にわたり決定打のない議論を生んできました。JSONはキー/値のペアに書き方が1通り、リストにも1通りしかありません。決定的なのは、JSONに配列が組み込みである一方、XMLには配列型がまったくないことです。リストは要素の繰り返しで表現されるため、あらゆるJSON→XMLツールが、繰り返し項目の命名とラップの規約で合意しなければなりません。

項目JSONXML
文法1ページに収まる(RFC 8259)XML 1.0に名前空間、infoset、DTDの仕組みが加わる
コンテナオブジェクトと配列要素。配列は要素の繰り返しで表現
型付け数値、ブール値、nullが組み込みスキーマが型を与えるまですべての値はテキスト
属性なし――1ペアにつき書き方は1通り属性か要素か、永遠の選択
名前空間なし。前置子の規約のみ語彙を統合するためのxmlns機構を内蔵
コメントなし。設計上取り除かれたあり。ツリーのどこにでも<!-- -->
スキーマ言語JSON SchemaXSD、DTD、Relax NG
混合コンテンツ表現不可能ネイティブ――テキストにマークアップが混ざる

スキーマと名前空間:XMLが依然として力を発揮する領域

XSDはエンタープライズにおけるXMLの地味な強みです。派生型、出現数の制約、パターンのファセット、そして文書を検証し「どの要素がどの規則に違反したか」を正確に報告できる20年分のツールを備えた、成熟したスキーマ言語です。JSON Schemaは違う形で同じ目的を追求しています――表現力があり、条件分岐をサポートし、現代のAPIの事実上の契約言語となっています――しかし長いドラフトの歴史のせいで、何を受け入れるかはツールによって差が大きくなります。どちらのエコシステムも厳格になれます。XMLのほうが単純に古いだけです。

名前空間はXMLのもう一つの長所です。XHTMLページは、各語彙が自分のURIを持つおかげで、キーの衝突なしにSVGやMathMLを埋め込めます。JSONには相当する機構がありません――名前の衝突は、規約や、JSON-LDのように文脈を明示的に添える階層化された設計によって避けられます。

サイズ、ストリーミング、そしてどちらを選ぶか

同じデータでもXMLのペイロードは通常大きくなります。終了タグだけで要素のマークアップはほぼ2倍になり、属性を多用するスタイルはさらに増えます。どちらのフォーマットもgzipでよく圧縮できます――XMLの冗長性は高度に圧縮可能です――しかし元のオーバーヘッドが完全に消えることはまれです。ストリーミングでは、XMLのパーサーエコシステムのほうが深いところまで根を張ります。SAXやStAXのようなプッシュ型パーサーは、メモリに載らない大きさのドキュメント向けに設計され、あらゆるプラットフォームに搭載されています。JSONのストリーミングパーサーも存在し優秀ですが、ドキュメント全体を一度に解析するのが依然として一般的な既定です。

プログラム同士がやり取りするものにはJSONを選びましょう:Web API、モバイルAPI、構造化ログ、サービス間のペイロードです。仕様が義務付けているとき――SOAPスタック、出版パイプライン、Officeフォーマット、医療や金融の多くの標準規格――、あるいはXSD検証と名前空間を通信経路で必要とするときにはXMLを選びましょう。指針はきれいに反転します。ドキュメントパイプラインに紛れ込んだJSONはたいていXMLであるべきで、SOAP時代のAPIがきれいなJSONを公開するのは裏切りではなく移行の勝利です。

よくある質問

JSONはXMLを置き換えつつあるのですか?

XMLを追い出したのは一つの領域であって、すべてではありません。JSONが今やAPI層――REST、モバイル、ブラウザ――を担う一方、XMLはドキュメントや標準規格が支配的な場所にしっかり居座っています:OfficeやEPUBファイル、SVGグラフィック、SOAPのエンタープライズ、そしてXMLを義務付ける出版・医療・金融の仕様です。両方学ぶ価値は今もあり、相互変換は日常的な作業です。

同じデータでXMLのほうがJSONより大きくなるのはなぜですか?

構造的な理由が2つあります。すべての要素に終了タグが必要なため、値ごとにマークアップを2回払い、XMLには配列が組み込みではありません――リストは独自のタグを持つ要素の繰り返しになります。圧縮をかければ繰り返しタグはgzipで非常によく縮むため差は縮まりますが、素のサイズの差は大きく、モバイル時代のAPIがJSONで標準化したのはこのためです。

ここでXMLやJSONを変換すると、データはアップロードされますか?

いいえ。どちらのコンバーターもサーバーを介さず、ブラウザのタブ内で解析と出力を行います――アップロード用エンドポイントは存在せず、サイトのContent-Security-Policyがネットワークアクセスをサイト自身に制限しています。変換中にDevToolsのネットワークパネルを開けば、ペイロードを運ぶ外向きリクエストが一切ないことを確認できます。

XMLの値は属性と子要素のどちらに入れるべきですか?

実用的なルールがあります。要素についてのメタデータ――識別子、型、単位、言語――は属性に、内容、特に長いもの、順序のあるもの、繰り返すもの、それ自体マークアップを含むものは子要素に入れます。属性は繰り返せず、構造を持てず、混合コンテンツからは見えません。だからこそ、何かのリストは必ず要素にする必要があります。

XSD検証はJSON Schemaより強力ですか?

原理ではなく成熟度で強力です。XSDには、企業が頼りにしてきた20年分の安定したツール、派生型、厳密な出現順序の規則があります。JSON Schemaは表現力が豊か――条件、パターンプロパティ、再利用可能な定義――で、現代のAPI契約では主流です。ツールチェーンがすでに検証に使っているものを選んでください。フォーマットを変えてもスキーマの必要性は消えません。

JSONの配列はどのようにXMLの要素になりますか?

XMLには配列型がないため、コンバーターは配列を、ラッパーの下の子要素の繰り返しか、同じ名前を共有する兄弟要素かにマッピングします――規約はツールによって異なり、往復変換ではこの違いが非常に重要になります。このサイトのコンバーターは使用しているマッピングを正確に文書化しているため、両方向に通したドキュメントでも挙動は予測可能です。

ここで引用した規格はどこで読めますか?

  • RFC 8259 — データ交換フォーマットJavaScript Object Notation(JSON)
  • XML 1.0 — 拡張可能なマークアップ言語(XML)1.0