ブラウザ上でJSONとYAMLを相互変換
JSONとYAMLは同じ種類のデータ — ネストされたマップ・リスト・文字列・数値・ブール値 — を表現しますが、見た目はまったく異なり、使われる場所も違います。APIやコンテナファイル、CIパイプラインに関わる時間があれば、いつかは一方を他方に変換する必要が生じます。このページはその変換を双方向で、すべてブラウザ内で行います。貼り付けたデータがマシンを離れることはありません。

JSONとは何か、どこで使われるか
JSON(JavaScript Object Notation)はマシンを第一に考えた厳格な括弧とブレースのフォーマットです。すべてのオブジェクトは{}で囲まれ、すべての配列は[]で囲まれ、キーと文字列の値はダブルクォートで囲まれ、アイテムはカンマで区切られます。RESTおよびGraphQL APIのデフォルトのワイヤーフォーマットで、ほとんどのウェブフックのボディで、NoSQLドキュメントの形式で、fetchコールが返すものです。ほぼすべての言語が標準でパースできます。JavaScriptではJSON.parse、Pythonの標準ライブラリではjsonモジュールとして提供されています。これこそがJSONがAPIレイヤーを制覇した理由です。トレードオフは、手で書くには冗長でコメントを禁止しているため、人間が一日中編集するファイルには不向きだということです。
YAMLとは何か、どこで使われるか
YAML(YAML Ain't Markup Language)は逆の優先順位、つまり人間を第一に設計されました。ブレースとクォートを省略し、インデントを使ってネストを表現し、#でコメントを書けます。その読みやすさこそが、設定の共通言語になった理由です。Docker Composeファイル・Kubernetesマニフェスト・GitHub ActionsとGitLab CIのワークフロー・Ansibleプレイブック・その他無数のアプリ設定ファイルはすべてYAMLです。典型的なYAMLドキュメントは同等のJSONよりも明らかに短く、プルリクエストでのdiffも格段に読みやすくなります。そのエレガントさのコストは脆弱性で、それがまさに変換が面白くなる部分です。
変換で重要な主な違い
ほぼすべての変換の判断を左右するのは3つの違いです。まず、YAMLでは空白が意味を持ちますが、JSONでは無意味です。YAMLはインデントに空白を使い — タブは使えません — そのため1つのスペースのずれでドキュメントの意味がサイレントに変わることがあります。JSONはインデントをまったく気にしません。次に、YAMLはコメントをサポートしますが、JSONはしません。YAMLの#コメントはJSON生成時に単純に消えます。置き場所がないからです。3番目に、YAMLはリッチで暗黙の型付けを持ちます。日付・タイムスタンプ・複数の綴りのnullを問題なく読み取り、クォートされていない値から型を推測します。JSONは小さく明示的な型セットを持ち、曖昧さはありません。また、JSONは技術的にはYAML 1.2のサブセットであるため、有効なJSONは通常YAMLとしてクリーンにパースされますが、逆は保証されません。

注意すべき変換の落とし穴
ラウンドトリップは常に無損失ではなく、どこで問題が起きるかを知っておくと役立ちます:
- ノルウェー問題。YAML 1.1のルールでは、クォートなしの
NOはブール値のfalseとしてパースされ、yes・on・offもブール値になります。国コードやスイッチラベルが気づかないうちにtrue/falseに変わることがあります。文字列として使いたい値はクォートで囲んでください。 - 数値の型変換。
3.10のようなバージョンは末尾のゼロが失われて3.1になることがあり、1.0はテキストとして使いたい場合でも数値になります。バージョン文字列とIDはクォートで囲んでください。 - アンカーとエイリアスが消える。YAMLの
&anchorと*alias参照にはJSON相当がありません。優れたコンバーターはそれらを完全な値に展開するため、データは正しくなりますが重複排除は失われます — JSONをYAMLに戻してもアンカーは再構築されません。 - コメントとブロックスカラー。コメントはJSONへの変換時に削除されます。複数行のブロックスカラー(
|と>)は\nエスケープを含む通常のJSON文字列に折りたたまれるため、視覚的な書式設定の意図が失われます。 - YAMLに戻す際のインデント。JSONはインデントをエンコードしないため、コンバーターが一貫したスタイルを選びます。タブに敏感なツールに貼り付ける前に確認してください。
ローカルのみの重要性
設定ファイルとAPIペイロードは、開発者が扱う中で最も機密性の高いものです。ホスト名・トークン・内部サービス名・顧客データが含まれていることが多く、ランダムなサーバーにアップロードすべきではありません。このコンバーターはブラウザ内でJavaScriptを使ってparse-and-emitステップを実行します。バックエンドに何も送信されず、ログも取られず、ページがロードされれば一度はオフラインでも動作します。KubernetesのシークレットやCIワークフローも安心して貼り付けられます。
関連ツールが必要ですか?完全なデータコンバーターセットを参照し、乱雑な入力をJSONフォーマッターでクリーンアップし、APIの世界と設定の世界の間を移動する必要があるときはまたここに戻ってきてください。
よくある質問
データはどこかにアップロードされますか?
いいえ。変換はすべてローカルのJavaScriptを使ってブラウザ内で実行されます。JSONやYAMLがサーバーに送信されることはないため、シークレットや設定ファイルはプライベートのまま保たれます。
YAMLのtrueやfalseの値が予期せず変わったのはなぜですか?
YAML 1.1はyes・no・on・offといったクォートされていない単語をブール値として扱います。これがノルウェー問題です。文字列として使いたい値はクォートで囲んで、変換後もテキストとして残るようにしてください。
YAMLをJSONに変換するとコメントはどうなりますか?
JSONにはコメントの構文がないため、変換中にすべてのハッシュコメントが削除されます。メモを保持する必要がある場合は、権威あるコピーをYAMLで保持してください。
YAMLのアンカーとエイリアスは保持されますか?
JSONには参照の仕組みがないため、それらは完全な値に展開されます。データは正しい状態を保ちますが、YAMLに戻すときに重複排除は回復できません。
YAMLからJSONだけでなく、JSONからYAMLにも変換できますか?
はい。ツールは双方向で動作します。JSONを貼り付けるとYAMLが得られ、YAMLを貼り付けるとJSONが得られ、コンバーターが相手のフォーマットを検出して出力します。
タブを使うとYAMLが壊れるのはなぜですか?
YAMLはインデントに空白が必要でタブを拒否します。貼り付けたものがパースに失敗した場合は、タブ文字を空白に置き換えてインデントを一貫させてください。
