本文へスキップ
jsonbeautifiers
日本語

JSONをYAMLに変換

Kubernetes、Compose、CI設定向け。設定ファイルをどこにも送りません。

JSON
YAML

貼り付けたものがブラウザの外に出ることはありません。 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へ変換した時点でそれらを永久に失います。手で管理している設定ファイルを変換する前に、知っておく価値のある一方通行の扉です。