本文へスキップ

JSON YAML 変換ツール

JSONをYAMLに、YAMLをJSONに変換します。エラーは行・列の位置まで示し、yes・noなどの値もYAML 1.2の基準で扱います。入力はブラウザの外に送信されません。

0文字 · 0行
インデント

YAML 1.2で出力します。YAML 1.1のパーサーが別の値として読みうる文字列(yes・no・on・off、日付など)は引用符で囲みます。 YAML 1.2.2仕様 (新しいタブで開きます)

0文字 · 0行

入力した内容はこのブラウザの中だけで処理され、サーバーには送信されません。 仕組みを見る

aとbの値を保持したJSONオブジェクトとYAMLマッピングの相互変換

使い方

上のタブで変換の方向(JSON → YAML または YAML → JSON)を選び、入力欄に貼り付けると結果が表示されます。JSON → YAMLではインデント(半角スペース2つ・4つ)とキーの並べ替えを、YAML → JSONではインデント(半角スペース2つ・4つ・タブ)と複数ドキュメントを配列にまとめるかどうかを選べます。結果はコピーするか、.yaml・.jsonファイルとしてダウンロードできます。「ファイルを開く」で.json・.yaml・.ymlファイルを読み込むと、拡張子に合わせて変換の方向が決まります。方向を切り替えると、直前の結果が入力欄に移るので、逆向きの変換を試せます。入力が正しくない場合は、結果の代わりに問題のある行・列とその周辺のコードを表示します。

初回の変換時にyamlライブラリを読み込みます。

JSONとYAMLの関係

どちらの形式も、オブジェクト(マッピング)・配列(シーケンス)・文字列・数値・真偽値・nullでデータを表します。JSONは波かっこ・角かっこ・二重引用符で構造を示しますが、YAMLは主にインデントと-・:で示すため、人には読み書きしやすくなっています。2009年に公開されたYAML 1.2は、YAMLをJSONの厳密な上位集合にすることを主な目的としていました。そのため正しいJSONはほとんどの場合YAMLとしても読めて、YAML → JSONモードにJSONを入れても変換できます。逆は成り立ちません。コメント・アンカー・複数ドキュメントなどJSONにない機能は、JSONに移すときに消えるか展開されます。

変換で変わるもの

  • コメント:JSONの文法(RFC 8259)にはコメントを書く場所がないため、YAML → JSONの変換ではすべて消えます。YAMLの仕様でも、コメントは表現上の要素にすぎずデータに影響しないと定められています。説明を残したい場合は、変換する前に_comment: "staging port"のようにキーと文字列の値として書いておいてください。結果には"_comment": "staging port"として入ります。#があれば何でもコメントになるわけではありません。http://a.com/#fragのように直前に空白がない#や、引用符の中の#は値の一部として残ります。コメントしかない入力は「変換するYAMLドキュメントがありません。コメントだけになっていないか確認してください。」というエラーになります。
  • アンカー・エイリアス(&name、*name):参照先の値をコピーして展開します。エイリアスが指数的に増える「Billion Laughs攻撃」を防ぐため、エイリアスの展開が多すぎる場合は変換を中止します(yamlライブラリの初期上限maxAliasCount 100)。攻撃ではない通常のファイルでも、1つのアンカーをエイリアスで100回参照すると同じエラーで止まります(99回までは変換でき、値の大きさは関係なく、<<のマージも1回と数えます)。エイリアスを含む値をさらにエイリアスで参照すると回数が掛け算になり、もっと早く止まります。その場合は、そのアンカーを参照するエイリアスの一部を実際の値に書き換えてください。
  • マージキー(<<):YAML 1.2のスキーマにはありませんが、docker composeなどの設定ファイルで広く使われているため、YAML 1.1のマージ規則どおりに展開します。
  • 複数ドキュメント(---):YAML → JSONで「複数ドキュメント(—)を配列にまとめる」がオン(初期設定)なら、ドキュメントごとに1要素のJSON配列に変換し、結果の欄に「ドキュメント3件」のように件数を表示します。オフにすると最初のドキュメントだけを変換し、残りのドキュメント数を警告で知らせます。ドキュメントが1つだけなら、この設定にかかわらず配列で囲みません。ファイルの末尾に中身のない---だけが残っていると、空のドキュメントとして数えられ、配列の最後にnullが1つ付きます。不要ならその行を削除してください。JSON → YAMLは、最上位が配列でも---で区切ったドキュメントには分けず、常に1つのドキュメントとして出力します。
  • キーの順序:YAMLとJSONのどちらも、仕様上オブジェクトのキーに順序はありませんが、このツールは入力の順序をそのまま保ちます("2"のような数字の形のキーも先頭に移しません)。JSON → YAMLで「キーを並べ替える」をオンにすると、すべてのオブジェクトのキーをUnicodeのコード単位順に並べ替えます。
  • タグ:!Refのようにこのツールが知らないタグは外し、値だけを移して警告を表示します。このとき、タグの付いた値は3やtrueのように書いても文字列になり、タグの付いた配列・オブジェクトは構造と中の値をそのまま移します。
  • JSONにない値:.inf・.nanはJSONにないためnullに置き換えて警告します。配列やオブジェクトをキーにしたYAMLは、そのキーをJSONテキストに変換します。
  • 重複キー:YAMLで1つのマッピングに同じキーが2回あると仕様違反なのでエラーにします。JSONで同じキーが2回あると、ブラウザのJSON.parseと同じく最後の値だけを残して警告します。

ノルウェー問題:yes・no・on・off

YAML 1.1ではy・yes・on・n・no・off(大文字・小文字の変形を含む)まで真偽値として読んでいました。そのため国コードの一覧にノルウェーのNOを引用符なしで書くとfalseに変わってしまい、これが「ノルウェー問題」と呼ばれています。YAML 1.2のコアスキーマは真偽値をtrue・false(とTrue・TRUEのように大文字で書いた形)に絞りました。このツールもこの基準で読むので、NO・yes・offは文字列のままです。YAML 1.1の方式で読むオプションはないので、真偽値として受け取りたい値はYAML側でtrueかfalseに書き換えてください。tRueのように大文字と小文字が混ざった書き方は文字列で、"true"のように引用符で囲んだ値も文字列です。

ただし、今もYAML 1.1の規則で読むツールがあります。そのためJSON → YAMLの結果では、1.1のパーサーが別の値として読みうる文字列を二重引用符で囲みます。真偽値の形の値(yes・no・on・off・y・nなど)、日付の形(2026-09-28)、60進数の形(1:20)、アンダースコアを含む数値の形(1_000)、マージキー<<が対象です。引用符で囲んだ値は、1.1でも1.2でも文字列です。

大きな整数と数値の精度

JavaScriptの数値はIEEE 754の倍精度なので、2^53 - 1(9007199254740991、16桁)を超える整数は末尾の桁が変わることがあります。このツールはどちらの方向でも整数をBigIntとして扱うため、64ビットのIDのような大きな整数も桁をそのまま移します。JSON → YAMLでは1.0のような末尾の0も入力のまま残します。YAML → JSONでは1.0は1になります。

YAML → JSONでは、引用符なしで書いた01234は整数として読まれて1234になり、同じように1.10は1.1、0x1Fは31、0o14は12になります。郵便番号・バージョン・コードのように書いたとおりに残したい値は、YAMLで"01234"のように引用符で囲んでください。そうすればJSONでも文字列として出力されます。JSON → YAMLは、"01234"や"12345678901234567890"のような数値の形をした文字列に引用符を付けて出力するので、読み直しても文字列のままです。

小数はどちらの方向でも倍精度の数値として扱うため、0.1234567890123456789のように有効桁数の多い小数は、どちらの方向でも最も近い倍精度の値に丸められます。指数表記の数値は書き方が変わります。JSON → YAMLでは1e3が1e+3に、YAML → JSONでは1e3が1000になります。倍精度の範囲を超える1e400のような値は、JSON → YAMLで.infになります。結果のJSONを受け取るプログラムが大きな整数を通常の数値として読むと、そちらで精度が落ちることがあるので、正確な値が重要なら元のデータで文字列にしておくのが安全です。

こんなときに使えます

  • Kubernetesのマニフェスト:慣例ではYAMLで書きますがJSONも使え、kubectlはAPIに送るときにマニフェストをJSONなどに変換します。APIの応答(JSON)をマニフェスト(YAML)に移したり、その逆を確認したりするときに便利です。
  • GitHub Actionsのワークフロー:.github/workflowsフォルダーにある.yml・.yamlファイルで、YAMLの文法で書きます。スクリプトが生成したJSONの設定をワークフローに移すときに役立ちます。
  • docker compose:既定のファイル名はcompose.yamlで、アンカー・エイリアスとマージキー(<<)でサービスの設定を再利用します。YAML → JSONに変換すると、マージを展開した最終的な値をひと目で確認できます。

参考資料

よくある質問

末尾にカンマが残っているJSONや単一引用符を使ったJSONは、JSON → YAMLでエラーになります。変換する方法はありますか?

YAML → JSONなら、末尾のカンマ・単一引用符・引用符なしのキーをYAMLとして読めます。例えば {'a': 'x', 'b': [1, 2,],} は {"a": "x", "b": [1, 2]} になり、方向を切り替えるとYAMLにできます。ただし //・/* */ コメントは先に削除してください。YAMLのコメントではなく、エラーや誤ったキーの原因になります。NaN・undefinedは数値や特殊値ではなく文字列として読みます。

JSON → YAMLの結果に |- や | のような記号が付きます。変換に失敗しているのですか?

いいえ。改行を含む文字列を、YAMLのブロック形式で書いたものです。{"msg": "line1\nline2"} を入れると、msg: |- の下にline1とline2が1行ずつインデントされて出力されます。| は改行をそのまま保つという印で、後ろに付いた - は文字列の末尾に改行がないという意味です。"line1\nline2\n" のように改行で終わる文字列は、- のない | で書きます。この結果をYAML → JSONで変換し直すと、元の "line1\nline2" がそのまま出てきます。自分で書くYAMLで | の代わりに > を使うと、結果が変わります。msg: > の下にline1とline2を2行で書くと、改行が空白に置き換わってつながり、"line1 line2\n" になります。記号を付けずに値を2行にわたって書いた場合も、同じようにつながって "line1 line2" になります。

YAMLで値を空にしたキーは、JSONではどうなりますか?

nullになります。port: のようにコロンの後ろを空にすると "port": null と出力され、~、null、Null、NULLと書いた値もすべてnullです。空文字列が必要なら、port: "" のように引用符を2つ書いてください。そうすれば "port": "" になります。nilとNoneはnullではなく、文字列の "nil"、"None" として出力されます。JSON → YAMLでは、nullはnull、空文字列は "" と書きます。文字列の "null" と "~" には引用符を付けて出力するので、そのYAMLを読み直してもnullには変わりません。空のオブジェクトと空の配列は {} と [] になります。

どのくらいの大きさの入力まで変換できますか?

どちらの方向もUTF-8で10MBまでの入力に対応し、貼り付けとファイル読み込みで上限は同じです。例えばハングル350万字は10,500,000バイトで上限を超えます。結果ではなく入力サイズの上限なので、大きいデータは分けて変換してください。

タブでインデントしたYAMLを入れるとエラーになります。どうすればよいですか?

YAMLはインデントにタブ文字を認めていません。そのため行頭にタブがあると「YAMLではインデントにタブを使えません。スペースに置き換えてください。」というエラーが出て、タブのある行と列も示されます。その行頭のタブをスペースに直せば変換できます。key: と値の間に入れたタブや、引用符の中のタブは問題になりません。「インデント」の「タブ」は、YAML → JSONが出力するJSONをタブで字下げする設定で、貼り付けるYAMLとは関係ありません。JSONはタブでインデントしてもかまわないので、JSON → YAMLはそうした入力も通常どおり変換し、出力されるYAMLは半角スペース2つか4つでインデントされます。

使用しているオープンソース: yaml (ISC)

最終更新日: