JSONとYAMLの概要

JSON(JavaScript Object Notation)

JSONは2001年にDouglas Crockfordが考案したデータ交換フォーマットです。

項目内容
策定2001年(RFC 8259)
拡張子.json
MIME Typeapplication/json
元の言語JavaScript(ただし言語非依存)
コメント非対応

YAML(YAML Ain’t Markup Language)

YAMLは2001年に策定されたデータシリアライゼーション言語です。人間が読みやすいことを重視して設計されています。

項目内容
策定2001年(最新: YAML 1.2.2)
拡張子.yml or .yaml
MIME Typeapplication/x-yaml
設計思想人間の可読性を重視
コメント対応# で記述)

構文の比較

同じデータをJSONとYAMLで表現

JSON

{
  "server": {
    "host": "localhost",
    "port": 3000,
    "debug": true
  },
  "database": {
    "host": "db.example.com",
    "port": 5432,
    "name": "myapp",
    "credentials": {
      "username": "admin",
      "password": "secret"
    }
  },
  "features": ["auth", "api", "websocket"],
  "cors": {
    "origins": [
      "https://example.com",
      "https://app.example.com"
    ]
  }
}

YAML

# サーバー設定
server:
  host: localhost
  port: 3000
  debug: true

# データベース設定
database:
  host: db.example.com
  port: 5432
  name: myapp
  credentials:
    username: admin
    password: secret

# 有効な機能
features:
  - auth
  - api
  - websocket

# CORS設定
cors:
  origins:
    - https://example.com
    - https://app.example.com

構文の違い一覧

要素JSONYAML
オブジェクト{ "key": "value" }key: value
配列["a", "b", "c"]- a(各行)
文字列"必ずダブルクォート"クォートなしでもOK
数値42, 3.1442, 3.14
真偽値true, falsetrue, false, yes, no
nullnullnull, ~
コメント非対応# コメント
ネスト{} の入れ子インデント
複数行文字列\n でエスケープ| or >

詳細な機能比較

可読性

観点JSONYAML
冗長性高い(括弧・カンマ・クォート)低い(インデントのみ)
コメント×
視認性構造が明確クリーンで読みやすい
編集しやすさツールでフォーマットインデントに注意が必要

YAMLの方が可読性に優れています。 特に設定ファイルなど、人間が頻繁に読み書きする場面ではYAMLが好まれます。

安全性

観点JSONYAML
インジェクション安全注意が必要
型の曖昧さなしありno が false になる等)
パーサーの安全性安全ライブラリによっては危険

YAMLには以下のセキュリティ上の注意点があります。

Norway問題

# 意図: 国コードのリスト
countries:
  - NO    # ノルウェーのつもりが、false(偽)として解釈される
  - JP
  - US

NO がYAMLでは false として解釈されます。文字列として扱うにはクォートで囲む必要があります。

countries:
  - "NO"
  - "JP"
  - "US"

日付の自動変換

# 意図: バージョン番号
version: 1.0    # 数値 1.0 として解釈される
date: 2026-03-31  # 日付として解釈される場合がある

パフォーマンス

観点JSONYAML
パース速度高速低速(JSONの5〜10倍遅い)
ファイルサイズやや大きいやや小さい
シリアライズ速度高速低速

JSONはシンプルな構文のため、パーサーの実装が容易で高速です。

用途別の使い分け

JSONが適しているケース

用途理由
Web API標準フォーマット。ほぼすべてのAPIがJSON対応
データ交換マシン間の通信に最適
package.jsonNode.jsのパッケージ設定
tsconfig.jsonTypeScriptの設定
データストアMongoDB、Firestore等

YAMLが適しているケース

用途理由
Docker Composedocker-compose.yml
Kubernetesマニフェストファイル
CI/CDGitHub Actions、CircleCI等
Ansibleプレイブック
Hugo / Jekyllfrontmatter
Spring Bootapplication.yml

判断基準

プログラムが主に読む → JSON
人間が主に読む → YAML
API通信 → JSON
設定ファイル → YAML(またはTOML)
コメントが必要 → YAML

相互変換の方法

コマンドラインでの変換

# JSON → YAML(yqを使用)
yq -P input.json > output.yaml

# YAML → JSON(yqを使用)
yq -o json input.yaml > output.json

# Pythonでの変換
python3 -c "import json, yaml, sys; print(yaml.dump(json.load(sys.stdin)))" < input.json

# jq + yqの組み合わせ
cat input.yaml | yq -o json | jq '.server.port'

JavaScript での変換

import yaml from 'js-yaml';

// YAML → JSON
const yamlText = `
server:
  host: localhost
  port: 3000
`;
const jsonObj = yaml.load(yamlText);
const jsonText = JSON.stringify(jsonObj, null, 2);

// JSON → YAML
const obj = JSON.parse('{"key": "value"}');
const yamlOutput = yaml.dump(obj);

Python での変換

import json
import yaml

# YAML → JSON
with open("config.yaml") as f:
    data = yaml.safe_load(f)

with open("config.json", "w") as f:
    json.dump(data, f, indent=2, ensure_ascii=False)

# JSON → YAML
with open("config.json") as f:
    data = json.load(f)

with open("config.yaml", "w") as f:
    yaml.dump(data, f, default_flow_style=False, allow_unicode=True)

その他の設定ファイルフォーマット

JSONとYAML以外にも、設定ファイルに使われるフォーマットがあります。

フォーマット特徴代表的な用途
TOMLシンプルで明確。コメント対応Cargo.toml、pyproject.toml
INI最もシンプル。セクション形式php.ini、.gitconfig
XML冗長だが厳密。スキーマ検証可能pom.xml、.csproj
HCLHashiCorp製。インフラ設定向けTerraform
JsonnetJSONの拡張。変数・関数対応Kubernetes設定

TOML — JSON/YAMLの代替候補

# TOML の例
[server]
host = "localhost"
port = 3000
debug = true

[database]
host = "db.example.com"
port = 5432

TOMLはJSON の厳密さとYAMLの可読性を両立したフォーマットで、近年人気が高まっています。

よくある質問

Q: JSON5とは?

JSON5はJSONの拡張で、コメント、末尾カンマ、シングルクォート等を許可します。設定ファイルでの使い勝手を改善する目的で作られました。

Q: .yml と .yaml のどちらを使うべき?

どちらでも動作しますが、公式の推奨は .yaml です。ただし、.yml も非常に広く使われています(特にDocker Compose)。プロジェクト内で統一することが重要です。

Q: JSONにコメントを書く方法はある?

JSON仕様ではコメントは非対応ですが、以下の回避策があります。

  • JSON5 を使う
  • "_comment" キーを使う(非標準)
  • JSONC(JSON with Comments)を使う(VS Code等が対応)

まとめ

比較項目JSONYAML
可読性
安全性
パース速度
コメント×
API通信×
設定ファイル
エコシステム

API通信やデータ交換にはJSON、設定ファイルにはYAMLが基本的な使い分けです。


YAMLの整形・バリデーションには AssistyのYAMLフォーマッター をご利用ください。ブラウザ上でYAMLの構文チェックと整形が行えます。