JSONとYAMLの概要
JSON(JavaScript Object Notation)
JSONは2001年にDouglas Crockfordが考案したデータ交換フォーマットです。
| 項目 | 内容 |
|---|---|
| 策定 | 2001年(RFC 8259) |
| 拡張子 | .json |
| MIME Type | application/json |
| 元の言語 | JavaScript(ただし言語非依存) |
| コメント | 非対応 |
YAML(YAML Ain’t Markup Language)
YAMLは2001年に策定されたデータシリアライゼーション言語です。人間が読みやすいことを重視して設計されています。
| 項目 | 内容 |
|---|---|
| 策定 | 2001年(最新: YAML 1.2.2) |
| 拡張子 | .yml or .yaml |
| MIME Type | application/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
構文の違い一覧
| 要素 | JSON | YAML |
|---|---|---|
| オブジェクト | { "key": "value" } | key: value |
| 配列 | ["a", "b", "c"] | - a(各行) |
| 文字列 | "必ずダブルクォート" | クォートなしでもOK |
| 数値 | 42, 3.14 | 42, 3.14 |
| 真偽値 | true, false | true, false, yes, no |
| null | null | null, ~ |
| コメント | 非対応 | # コメント |
| ネスト | {} の入れ子 | インデント |
| 複数行文字列 | \n でエスケープ | | or > |
詳細な機能比較
可読性
| 観点 | JSON | YAML |
|---|---|---|
| 冗長性 | 高い(括弧・カンマ・クォート) | 低い(インデントのみ) |
| コメント | × | ○ |
| 視認性 | 構造が明確 | クリーンで読みやすい |
| 編集しやすさ | ツールでフォーマット | インデントに注意が必要 |
YAMLの方が可読性に優れています。 特に設定ファイルなど、人間が頻繁に読み書きする場面ではYAMLが好まれます。
安全性
| 観点 | JSON | YAML |
|---|---|---|
| インジェクション | 安全 | 注意が必要 |
| 型の曖昧さ | なし | あり(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 # 日付として解釈される場合がある
パフォーマンス
| 観点 | JSON | YAML |
|---|---|---|
| パース速度 | 高速 | 低速(JSONの5〜10倍遅い) |
| ファイルサイズ | やや大きい | やや小さい |
| シリアライズ速度 | 高速 | 低速 |
JSONはシンプルな構文のため、パーサーの実装が容易で高速です。
用途別の使い分け
JSONが適しているケース
| 用途 | 理由 |
|---|---|
| Web API | 標準フォーマット。ほぼすべてのAPIがJSON対応 |
| データ交換 | マシン間の通信に最適 |
| package.json | Node.jsのパッケージ設定 |
| tsconfig.json | TypeScriptの設定 |
| データストア | MongoDB、Firestore等 |
YAMLが適しているケース
| 用途 | 理由 |
|---|---|
| Docker Compose | docker-compose.yml |
| Kubernetes | マニフェストファイル |
| CI/CD | GitHub Actions、CircleCI等 |
| Ansible | プレイブック |
| Hugo / Jekyll | frontmatter |
| Spring Boot | application.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 |
| HCL | HashiCorp製。インフラ設定向け | Terraform |
| Jsonnet | JSONの拡張。変数・関数対応 | 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等が対応)
まとめ
| 比較項目 | JSON | YAML |
|---|---|---|
| 可読性 | ○ | ◎ |
| 安全性 | ◎ | ○ |
| パース速度 | ◎ | △ |
| コメント | × | ○ |
| API通信 | ◎ | × |
| 設定ファイル | ○ | ◎ |
| エコシステム | ◎ | ○ |
API通信やデータ交換にはJSON、設定ファイルにはYAMLが基本的な使い分けです。
YAMLの整形・バリデーションには AssistyのYAMLフォーマッター をご利用ください。ブラウザ上でYAMLの構文チェックと整形が行えます。