JSONからYAMLへの変換:完全移行ガイド
JSONとYAMLは同じデータ構造を異なる構文で表現します。ほとんどの場合、フォーマット間の変換は簡単ですが、型、複数行文字列、コメントに関するエッジケースには注意が必要です。このガイドでは、フォーマット間の完全なマッピングを解説します。
構文のマッピング
オブジェクト / マッピング
JSON:
{
"database": {
"host": "localhost",
"port": 5432,
"name": "myapp"
}
}
YAML:
database:
host: localhost
port: 5432
name: myapp
配列 / シーケンス
JSON:
{
"servers": ["web1", "web2", "web3"]
}
YAML:
servers:
- web1
- web2
- web3
ネストされた構造
JSON:
{
"services": [
{
"name": "api",
"ports": [8080, 8443],
"env": {"NODE_ENV": "production"}
}
]
}
YAML:
services:
- name: api
ports:
- 8080
- 8443
env:
NODE_ENV: production
当サイトのJSONからYAMLへのコンバーターで即座に変換できます。
注意すべきエッジケース
1. コメント
YAMLはコメントをサポートしていますが、JSONはサポートしていません。YAMLからJSONに変換すると、すべてのコメントが失われます:
# このコメントはJSONでは失われます
database:
host: localhost # これも失われます
2. 複数行文字列
YAMLにはJSONにない強力な複数行構文があります:
description: |
This is a multi-line
string that preserves
line breaks.
JSONでは以下のようになります:
{
"description": "This is a multi-line\nstring that preserves\nline breaks.\n"
}
3. 型の曖昧さ
YAMLは型を自動検出するため、問題が発生する場合があります:
version: 1.0 # 浮動小数点数であり、文字列 "1.0" ではない
port: 080 # 8進数の64であり、文字列 "080" ではない
country: NO # ブール値のfalseであり、文字列 "NO" ではない
JSONでは型は明示的です:
{
"version": "1.0",
"port": "080",
"country": "NO"
}
JSONからYAMLに変換する際は、誤って解釈される可能性のある値を引用符で囲みましょう。
4. Null値
両方ともnullをサポートしていますが、構文が異なります:
value: null # 明示的
value: ~ # YAMLの省略形
value: # 空の値 = null
{ "value": null }
5. キーの特殊文字
JSONのキーには任意のUnicode文字を含めることができます。特殊文字を含むYAMLキーには引用符が必要です:
"content-type": "application/json" # ハイフンには引用符が必要
simple_key: value # アンダースコアは問題なし
コマンドラインでの変換
yq(YAMLプロセッサ)の使用
# JSONからYAMLへ
yq -P input.json > output.yaml
# YAMLからJSONへ
yq -o=json input.yaml > output.json
Pythonの使用
# JSONからYAMLへ
python3 -c "import json, yaml, sys; print(yaml.dump(json.load(sys.stdin), default_flow_style=False))" < input.json > output.yaml
# YAMLからJSONへ
python3 -c "import json, yaml, sys; print(json.dumps(yaml.safe_load(sys.stdin), indent=2))" < input.yaml > output.json
jq + yqの併用
# JSONを処理してYAMLとして出力
cat config.json | jq '.database' | yq -P
各フォーマットを使うべきタイミング
| 基準 | JSON | YAML |
|---|---|---|
| 人間による編集 | 難しい(括弧、カンマ) | 簡単(クリーンな構文) |
| マシンによる解析 | 高速 | 低速 |
| コメント | 非対応 | 対応 |
| データ交換 | 標準(API) | まれ |
| 設定 | 許容範囲 | 推奨 |
| 厳密さ | 厳密(良い) | 柔軟(リスクあり) |
JSONを使うべき場合: API通信、データストレージ、マシンが生成する設定、ブラウザ環境。
YAMLを使うべき場合: 人間が編集する設定、Docker Compose、Kubernetes、CI/CDパイプライン、Ansible。
より詳しい比較は、YAMLとJSONの比較の記事をご覧ください。
FAQ
YAMLはJSONのスーパーセットですか?
はい、YAML 1.2(2009年)以降、すべての有効なJSONドキュメントは有効なYAMLでもあります。YAMLパーサーはJSONを直接解析できます。ただし、その逆は成り立ちません — コメント、アンカー、複数行文字列などのYAML機能にはJSONでの対応がありません。
JSONとYAML、どちらの解析が速いですか?
ほぼすべての言語でJSONの解析が大幅に速くなります。JSONパーサーは、処理する構文が少ないためシンプルです。起動時に一度だけ読み込む設定ファイルの場合、その差はわずかです。高スループットのデータ処理では、JSONが明らかに優れた選択です。
関連リソース
- JSONからYAMLコンバーター — フォーマット間を即座に変換
- YAMLとJSONの比較 — 詳細なフォーマット比較
- YAML構文チュートリアル — YAMLをゼロから学ぶ