JSONをYAMLに変換
Kubernetes、Compose、CI設定向け。設定ファイルをどこにも送りません。
貼り付けたものがブラウザの外に出ることはありません。 connect-src の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる
JSONをYAMLに変換します。Kubernetesのマニフェスト、Docker Composeのファイル、GitHub Actionsのワークフローなど、読みやすい形式を好むものすべてに使えます。
YAMLはJSONの上位集合なので、この方向の変換は常に成功します。面白いのは逆方向のほうです。
何が変わり、何が変わらないか
JSONのすべての値にはYAMLでの対応物があるので、失われるものはありません。オブジェクトはマッピングに、配列はシーケンスになり、キーや単純な文字列を囲む引用符は消えます。
別のものと取り違えられかねない文字列は、引用符を保ったままにします。noという語、yesという語、数値に見えるもの、日付に見えるものが該当します。ダンパーがここで慎重なのは意図的で、その理由は「YAMLをJSONに変換」のページに書いてあります。
大きな整数
YAMLには任意精度の整数がありますが、値は途中でJavaScriptを通り抜けなければなりません。2^53-1を超える整数は、桁を失わないようクォート付きの文字列として書き出し、そうしたことを変換結果で通知します。丸めた数値を黙って出力するほうが、はるかに悪い選択です。
行幅
行の折り返しは既定でオフです。YAMLのダンパーは伝統的に長い文字列を80桁で折り返します。文章にはそれでよいのですが、URL、base64のかたまり、コマンドラインにとっては最悪です。折り返された形はgrepしにくく、編集もしにくいからです。折り返さない出力こそ、ほとんどの人が望むものです。
How to do this in code
コードでの変換。
py Python
PyYAMLは既定でキーをソートします。忠実に変換したかった設定ファイルの並びを、黙って組み替えてしまいます。
import json, yaml
data = json.loads(text)
out = yaml.safe_dump(
data,
sort_keys=False, # default is True, which reorders your file
default_flow_style=False,
allow_unicode=True, # otherwise é becomes an escape
width=10**6, # effectively no wrapping
) sh Shell
# yq, the YAML counterpart to jq
yq -P eval . input.json > output.yaml
# Or via Python, with no extra install
python -c 'import sys,json,yaml; yaml.safe_dump(json.load(sys.stdin), sys.stdout, sort_keys=False)' < in.json js JavaScript
import { dump } from 'js-yaml';
const yaml = dump(JSON.parse(text), {
lineWidth: -1, // no wrapping
noRefs: true, // no anchors and aliases in the output
}); よくある質問
- YAMLは本当にJSONの上位集合なのですか?
- YAML 1.2は、設計としてそうです。妥当なJSONドキュメントはすべて妥当なYAMLです。YAML 1.1は完全にはそうではなく、バージョンが重要になる理由がまたひとつ増えます。
- 出力で一部の文字列に引用符が付くのはなぜですか?
- 引用符がないと、別のものとして解釈されてしまうからです。no、yes、on、off、true、null、裸の数値、そして日付に見えるものは、少なくとも一部のYAMLパーサーで文字列のままでいるために引用符を必要とします。ダンパーがあなたの代わりに用心しているということです。
- 逆方向に変換するときコメントは残せますか?
- 残せません。JSONにはコメントの構文がないため、コメント付きのYAMLファイルはJSONへ変換した時点でそれらを永久に失います。手で管理している設定ファイルを変換する前に、知っておく価値のある一方通行の扉です。