YAML と JSON:どちらを、なぜ選ぶか
YAML と JSON の比較
YAML と JSON:違い、落とし穴、.yaml と .yml | We.Inc
YAML と JSON を並べて比較します。構文、コメント、型、複数行テキスト、yes/no の落とし穴。裸の値がどう解釈されるかを試し、.yaml と .yml の問題にも決着をつけましょう。
JSONはプログラム向けの厳格なデータ形式で、波かっこ、角かっこ、二重引用符で囲んだ文字列を使い、コメントは書けません。YAMLは同じデータをインデントで表現し、コメントや複数行テキストを書けます。バージョン 1.2 はJSONのスーパーセットとして設計されました。APIや機械の出力にはJSONを、人が手で編集するファイルにはYAMLを選びましょう。
YAML と JSON の機能ごとの比較
- 構造
- 波かっこと角かっこ
- インデント(スペースのみ)、またはJSON風のフロー形式
- 文字列
- 常に二重引用符で囲む
- 引用符なし、一重引用符、二重引用符のいずれか
- 複数行テキスト
- 1つの文字列の中でエスケープした \n
- | または > を使うブロックスカラー
- 1ファイルに複数のドキュメント
- 不可
- 可能。--- で区切る
- メディアタイプ
- application/json
- application/yaml
どちらの形式も、マップ、リスト、文字列、数値、真偽値、null という同じものを記述します。本当の違いは、誰がファイルを読むのか、そしてパーサーがどれだけ寛容かです。下の値チェッカーで引用符なしの値にどんな型が付くかを試し、その後で並べた例と、両者を行き来する人がつまずく落とし穴を読んでください。
- yes、0x1F、1e3、~ など、裸の値を1つ値チェッカーに入力します。
- YAML 1.2 のパーサーがどんな型を付けるか、古い YAML 1.1 のパーサーではどう違う可能性があるか、そしてそのままの形でJSONとして受け付けられるかを確認します。
- さらに下の例で、同じレコードを両方の形式で書いたものを比べます。
- 型が意外だった値は引用符で囲み、設定ファイルでもその習慣を続けましょう。
- YAMLのインデントにはスペースを使いましょう。仕様はインデントでのタブ文字を禁止しており、手で編集したファイルの解析エラーの多くは紛れ込んだタブが原因です。
- 国コード、バージョン番号、yes、no、on、off のような値は引用符で囲みましょう。一部のパーサーはいまだに YAML 1.1 の規則に従い、それらを真偽値に変えてしまいます。
- ツールが両方の形式を受け付けるなら、コードからはJSONを生成し、人が保守するファイルにはYAMLを使いましょう。
- どちらも検証しましょう。JSONはフォーマッターに通し、YAMLはアプリと同じライブラリで読み込みます。パーサーは細かいところで挙動が異なるためです。
よくある質問
JSONファイルはすべて有効なYAMLですか?
YAML 1.2 はJSONの厳密なスーパーセットになるよう書かれているので、実際にはJSONのドキュメントは YAML 1.2 のパーサーで読み込めます。ただし例外もあり、たとえば重複キーはJSONのパーサーでは許容されることが多いものの、YAMLでは禁止されています。
.yaml と .yml のどちらを使うべきですか?
.yaml を使いましょう。application/yaml メディアタイプを登録した RFC 9512 は .yaml を推奨の拡張子とし、.yml もまだ使われていると記しています。GitHub Actions などのツールではどちらも動くので、1つのプロジェクト内で統一することが大切です。
YAMLの値が true や false になったのはなぜですか?
YAML 1.1 は yes、no、on、off、y、n などの語を真偽値として扱っていました。YAML 1.2 のコアスキーマが受け付けるのは3通りの大文字小文字表記の true と false だけですが、古いパーサーもまだ広く使われています。値を引用符で囲めば迷いがなくなります。
JSONにコメントは書けますか?
いいえ。RFC 8259 にはJSONに含められるトークンが列挙されており、コメントはその中にありません。コメント付きの緩いJSONを受け付けるツールもありますが、厳格なパーサーはそのファイルを拒否します。
解析が速いのはどちらですか?
JSONの文法のほうがはるかに小さく、ブラウザーにはネイティブのパーサーが組み込まれているので、ネットワーク越しに送るデータには通常こちらのほうが速くて安全です。YAMLのパーサーは、インデントから暗黙の型付けまで、はるかに多くの規則を適用しなければなりません。
JSONのほうが適している場合
- API、ブラウザーのストレージ、ログなど、あるプログラムが別のプログラムに読ませるために書くものです。文法はとても小さく、どの言語にも厳格なパーサーがあり、各値の書き方が1通りしかないので、差分も予測しやすいままです。
- JSONには暗黙の型付けもありません。文字列は引用符があるから文字列なのであり、これで想定外の挙動がまるごと1種類なくなります。
YAMLのほうが適している場合
- 人が読んで編集する設定です。CIのワークフロー、コンテナーの構成、サイトのフロントマター、デプロイのマニフェストなどです。コメントで設定がある理由を説明でき、ブロックスカラーを使えばシェルスクリプトや長いメッセージも読みやすく保てます。
- その代わり、空白に意味があり、引用符なしの値は推測で型が付きます。ファイルは短く保ち、あいまいなものは引用符で囲み、CIでリンターを実行しましょう。
1つのレコードを両方の形式で書く
同じサイト設定を両方の形式で書いたものです。YAMLは引用符と波かっこを省いてコメントを加え、JSONはすべての文字列と入れ子の階層を明示します。
2スペースのインデント、コメント、リスト、そしてテキストのまま保つために引用符で囲んだバージョン文字列。
コメントは書けず、すべてのキーと文字列に二重引用符が付きます。
引用符を忘れると型が変わる値
引用符なしのYAMLの値に付く型と、安全な書き方
- 書いた内容
- YAML 1.2 コアスキーマでの解釈
- より安全な書き方
- version: 2.10
- 浮動小数点数 2.1(末尾のゼロが失われる)
- version: "2.10"
- country: NO
- 1.2 では文字列、1.1 では真偽値 false
- country: "NO"
- port: 0x1F90
- 整数 8080
- port: 8080
- mode: 0o755
- 整数 493
- mode: "0o755"
- ratio: .inf
- 浮動小数点数の無限大(JSONでは表せない)
- ratio: "inf"
この裸の値はどう解釈される?
YAMLファイルでコロンの後に書くのと同じように、引用符なしで値を入力してください。チェッカーは YAML 1.2 コアスキーマの規則、YAML 1.1 の真偽値リスト、JSONの文法を適用します。
引用符なしの値
YAML 1.2 コアスキーマ
YAML 1.1 のパーサー
JSON(そのままの形)
JSONでの同じ値
真偽値 {v}(YAML 1.1 はこの語を真偽値として読みます)
この値には yes/no 型の真偽値の落とし穴はありません
有効なJSONの値
引用符で囲まない限り有効なJSONではありません
JSONにはこの数値を書く方法がありません
試してみる
無料で始める · クレジットカード不要
関連: ガイド|Webマーケティングと集客を学ぶ
製品
ご利用いただける方
機能
リソース
会社情報
サイトマップを見る