JSON と YAML:同じデータの2つの書き方
JSON と YAML は同じものを表現できます。オブジェクト(YAML ではマッピングと呼びます)、リスト、文字列、数値、真偽値、null です。JSON は波かっこ、角かっこ、クォート、カンマを使います。YAML はインデントとハイフンを使うので、短く、人が読んだり手で編集したりしやすくなります。そのため Kubernetes、Docker Compose、GitHub Actions、Ansible などのツールは設定に YAML を使い、API はふつう JSON でやり取りします。
この2つの間を行き来する場面はよくあります。API が返した JSON を設定ファイルに入れたいとき。あるいは YAML の設定を、JSON しか読めないプログラムに渡したいとき。この変換ツールは、どちらの向きにも対応しています。
使い方
- JSON から YAML または YAML から JSON のボタンで、変換の向きを選びます。
- 左のボックスにデータを貼り付けるか、ファイルを開く または サンプル を押します。入力に合わせて右側に結果が表示されます。
- インデント をスペース2つかスペース4つから選びます。YAML から JSON の向きでは「圧縮」も選べます。
- JSON から YAML の向きでは、キーを並べ替え をオンにすると、キーがアルファベット順(A→Z)に並びます。
- コピー を押すか、ダウンロード で
.yamlまたは.jsonファイルとして保存します。
向きを切り替えると、今の結果が入力欄に移るので、行ったり来たり変換して、往復しても同じになるか確かめられます。
JSON から YAML への変換例
{"name":"web-app","version":3,"private":true,"ports":[80,443],"database":{"host":"localhost","password":null},"tags":["api","v2"]}
これが次のようになります。
name: web-app
version: 3
private: true
ports:
- 80
- 443
database:
host: localhost
password: null
tags:
- api
- v2
安全なクォート
文字列の中には、YAML のパーサーから見ると別の型に見えるものがあります。このツールはそうした文字列をクォートで囲み、文字列のまま保ちます。次の JSON は
{"zip":"02134","enabled":"yes","version":"1.10","note":"a: b","empty":""}
こうなります。
zip: "02134"
enabled: "yes"
version: "1.10"
note: "a: b"
empty: ""
クォートがないと、02134 は先頭のゼロが消え、1.10 は数値の 1.1 になり、古い YAML 1.1 のパーサー(PyYAML や多くの CI ツールがこのルールを使っています)は yes を true と読んでしまいます。このツールはより厳しいクォートのルールに従うので、古いパーサーでも新しいパーサーでも同じ意味に読まれます。"2024-01-15" のような日付も、同じ理由でクォートされます。郵便番号や電話番号のように先頭が 0 の値も、文字列のまま残ります。
YAML から JSON への変換例
# App settings
name: web-app
ports:
- 80
- 443
debug: false
retries: 3
owner: ~
これが次のようになります。
{
"name": "web-app",
"ports": [
80,
443
],
"debug": false,
"retries": 3,
"owner": null
}
JSON にはコメントがないのでコメントは消え、YAML で null を表す省略記法の ~ は null になっています。
マージキーも展開されます。次の Rails 風のファイルは
defaults: &defaults
adapter: postgres
host: localhost
development:
<<: *defaults
database: dev_db
こうなります。
{
"defaults": {
"adapter": "postgres",
"host": "localhost"
},
"development": {
"adapter": "postgres",
"host": "localhost",
"database": "dev_db"
}
}
--- で区切られた2つのドキュメント(たとえば kind: Service と kind: Deployment)は、1つの配列になります。「圧縮」を選ぶと [{"kind":"Service"},{"kind":"Deployment"}] となります。
値の読み取り方
YAML から JSON への変換は、YAML 1.2 のルールに従います。このルールでは yes、no、on はただの文字列で、真偽値になるのは true と false だけ、日付も文字列のままです。次の入力は
a: yes
b: no
c: on
d: true
e: 010
f: 0o10
g: 1e3
h: 2024-01-15
(圧縮した形で)次のように変換されます。
{"a":"yes","b":"no","c":"on","d":true,"e":10,"f":8,"g":1000,"h":"2024-01-15"}
010 は10として読まれ、0o10 は8進数の8である点に注意してください。
テキストのまま残したい値は、YAML の中でクォートで囲んでください。
往復変換をきれいに行うコツ
- JSON を YAML に変換して戻すと、データは同じになりますが、テキストまで同じになるとは限りません。キーを並べ替え をオンにしない限り、キーの順序は保たれます。
- YAML のコメント、アンカー、カスタムタグに相当するものは JSON にありません。アンカーはデータの完全なコピーに展開されます。
- 20桁の ID のような非常に大きな整数は、ブラウザが対応していれば、JSON から YAML への変換では正確に保たれます。YAML から JSON への変換では JavaScript の数値を経由するので、長い ID はクォートした文字列として保存してください。
- ファイルは端末内にとどまります。何もアップロードされません。
エラー
ミスは行と列で報告され、入力欄で表示 でその場所へ移動できます。JSON の末尾にカンマがあると 3行目、1列目:"}" の前の末尾のカンマは使えません と表示されます。YAML でキーが重複していると、YAML ライブラリの英語のメッセージ Map keys must be unique が表示され、インデントにタブを使っているとエラーになります。YAML ではスペースしか使えないためです。
ほかの変換方法
yq:Go 版の yq はコマンドラインで変換できます。JSON は正しい YAML でもあるので JSON を入力として読み込め、どちらの形式でも出力できます。
Python:PyYAML パッケージを使えば、yaml.safe_dump(json.load(f)) で JSON ファイルから YAML を書き出せます。PyYAML は YAML 1.1 に従うので、yes や no のような文字列は確認してください。
VS Code:選択範囲を JSON と YAML の間で変換するコマンドを追加する拡張機能がいくつかあります。
関連ツール
YAML ファイルを変換せずに整えるには YAML整形ツール を使ってください。先に JSON をチェックしたり整形したりするには JSON整形ツール を使います。スプレッドシートのデータなら、まず CSV JSON 変換ツール から始めてください。