cv.cm

基礎知識 · テキスト・データ・セキュリティ

JSON・YAML・XML の違いは?どの形式を使うべきか

約7分で読めます

結論

JSON、YAML、XML は構造化データを表すテキスト形式です。JSON はコンパクトで厳格、値の型は6種類で、Web API の主流です。YAML はインデントで構造を表し、コメントを書けるため、設定ファイルでよく使われます。XML はタグと属性を使い、名前空間と正式なスキーマに対応しており、文書、企業システム、フィードでいまも広く使われています。3つとも同じ入れ子のデータを表現できます。

JSONフォーマッタを開く

同じデータを3つの形式で書く

名前、有効フラグ、2つの役割を持つユーザーは、各形式で次のようになります。

形式例
JSON{"name": "Ana", "active": true, "roles": ["admin", "editor"]}
YAMLname: Ana / active: true / roles: [admin, editor](1行に1キー)
XML<user active="true"><name>Ana</name><role>admin</role><role>editor</role></user>

JSON と YAML は、ほとんどのプログラミング言語のオブジェクト、リスト、スカラー値にそのまま対応します。XML は要素のツリーを表し、オブジェクトへの対応づけは慣習にすぎません。この例でも有効フラグは属性にも子要素にもでき、XML 自体には値がテキストの true ではなく真偽値だと示す仕組みがありません。

並べて比較

JSONYAMLXML
仕様RFC 8259、ECMA-404YAML 1.2.2(2021年)W3C XML 1.0 第5版
構造波かっこと角かっこインデント開始タグと終了タグ
コメント書けない# comment<!-- comment -->
組み込みの型オブジェクト、配列、文字列、数値、真偽値、nullマップ、シーケンス、型が解決されるスカラースキーマで型を指定しない限りテキストのみ
スキーマ言語JSON Schema通常は JSON SchemaXSD、DTD、RELAX NG
その他の機能なしアンカーとエイリアス、1ファイルに複数ドキュメント属性、名前空間、混合コンテンツ
主な用途Web API、ブラウザーのデータ、ログ設定:Kubernetes、CI パイプライン、Docker ComposeOffice ファイル、SVG、RSS、SOAP、Android のレイアウト

JSON:厳格で予測しやすい

JSON の文法は1ページに収まるほど小さく、そのためどの言語のパーサーでも解釈が一致します。その厳格さが、よくあるエラーの原因にもなります。

  • キーと文字列にはダブルクォートが必要で、シングルクォートは無効です。
  • オブジェクトや配列の最後の要素のあとにカンマ(末尾カンマ)は付けられません。
  • コメントが書けないので、JSON で書いた設定ファイルには説明を入れられません。JSONC や JSON5 などの派生形式はコメントを追加できますが、標準の JSON ではありません。
  • RFC 8259 は、システム間でやり取りする JSON には UTF-8 を使うよう求めています。

文法上、数値の大きさに上限はありませんが、RFC 8259 はほとんどのソフトウェアが IEEE 754 の倍精度浮動小数点数を使うと注記しています。JavaScript では 9007199254740992(2^53)を超える整数は精度が失われるので、大きな ID は文字列として送るほうが安全です。

YAML:読みやすいが、落とし穴もある

YAML は人が読み書きしやすいように設計されており、YAML 1.2 は JSON のほぼ上位互換なので、ほとんどの JSON ファイルは YAML としても有効です。ただし柔軟さには代償があります。

  • インデントが構造そのものです。スペースが1つずれるだけで入れ子が変わり、インデントにタブは使えません。
  • クォートしない値は型が推測されます。いまも多くのパーサーが使う YAML 1.1 のルールでは no、off、yes が真偽値になるため、国コードの NO が false に変わります。YAML 1.2 のコアスキーマで真偽値として扱うのは true と false だけですが、使っているパーサーがどのバージョンを実装しているか確認しましょう。
  • 1.10 のような値は数値の 1.1 に、012 は8進数になることがあります。バージョン番号や郵便番号など、数値に見えるだけの文字列はクォートしましょう。

XML:冗長だが、文書のために作られている

単純なデータでは XML は JSON より重くなりますが、他の形式にできないことができます。混合コンテンツ(<p>Hello <b>world</b></p> のようにインラインのマークアップを含むテキスト)、出どころの異なる語彙を1つのファイルに共存させる名前空間、XSD による成熟した検証などです。DOCX、XLSX、SVG、RSS などの形式の中身は XML です。

XML から JSON への変換は、本質的に情報が失われます。属性、要素の順序、繰り返し要素、混合コンテンツには JSON で一意に対応するものがないため、変換ツールは属性に @ を付ける、繰り返し要素を必ず配列にするといった慣習を選んでいます。

よくある質問

YAML は JSON の上位互換ですか?

YAML 1.2 は JSON のほぼ厳密な上位互換になるよう改訂されたので、ほとんどすべての JSON ドキュメントは YAML として解析できます。一部の特殊なケースでは違いがあり、YAML 1.1 のパーサーは互換性がより低くなります。

JSON でコメントが書けないのはなぜですか?

作者が、相互運用性を壊すような解析指示をコメントに入れられないよう、あえて除外したためです。設定ファイルにコメントが必要なツールは、代わりに JSONC、JSON5、YAML を使います。

JSON と XML ではどちらが速く解析できますか?

同じデータなら、たいてい JSON のほうが速く、サイズも小さくなります。文法が単純で、終了タグ、属性、名前空間がないためです。差が問題になるのは主に大量のデータを扱う場合です。

YAML を JSON に変換しても何も失われませんか?

データは残りますが、コメント、アンカー、キーの書式は失われます。JSON にはそれらを入れる場所がないからです。JSON から YAML への変換では何も失われません。

基礎知識の記事一覧