二つの変換方向
本ツールは,「YAMLからJSON」および「JSONからYAML」という二つの変換方向をサポートしており,画面上の「方向を切り替え」ボタンによって動作モードを決定します.初期状態では「yaml-to-json」モードとなっており,左側のテキストエリアにYAML文字列を入力して「変換する」ボタンを押下することで,右側のエリアにJSON形式の文字列が出力されます.
モードを切り替えると,変換元と変換先が逆転し,それまで入力と出力の内容とエラーメッセージがすべてクリアされる仕様となっています.入力されたテキストは,ブラウザ内で稼働するJavaScriptのパーサによって処理されます.例えば,入力エリアにサンプルのYAMLデータ(title: ZeroTools や version: 2.5 など)を入力して変換を実行すると,内部でJavaScriptのオブジェクトとして解釈された後,JSON.stringifyの関数呼び出しを通じてインデント幅が2スペースのJSON文字列へと整形されます.
逆に,JSONからYAMLへと変換する場合は,JSON.parseによってオブジェクト化されたデータが,js-yamlのdumpメソッドに渡されます.この際,オプションとしてindent: 2やforceQuotes: trueが指定されているため,出力されるYAMLの文字列スカラーには明示的なクォーテーションが付与される形で生成されます.
変換の基盤となる処理は対象の入力テキストをオブジェクトモデルへマッピングする工程に集約されており,ファイルシステムの読み書きは伴わず,あくまでテキストエリア間の文字列変換として動作します.
JSON相当の型解決
本ツールにおけるYAMLデータの解析には,js-yamlライブラリが採用されており,その読み込み時のスキーマとしてJSON_SCHEMAが指定されています.これは,YAML 1.2規格における多様な型表現のうち,JSON相当の値を扱う設定です.ただしYAML公式JSONスキーマの型解決制約を厳格に再現するわけではなく,数値等の扱いはjs-yamlの仕様に従います.
この仕様により,入力されたデータはJSONが許容する型(文字列,数値,真偽値,null,配列,オブジェクト)にマッピングされます.例えば,YAMLにおいて日付や時刻を表すタイムスタンプ形式を入力した場合,YAML独自の拡張タグによる日付オブジェクトとしては評価されず,単純な文字列型として扱われます.
同様に,YesやNo,OnやOffといった表記も,真偽値ではなく文字列としてパースされるため,JSONへの変換結果では "yes" や "On" という文字列として出力される点に注意が必要です.真偽値として認識させるには,true または false と明記する必要があります.
また,JavaScriptの数値処理の制約により,非有限数(InfinityやNaN)が含まれる場合,バリデーションロジックの段階で「JSONに変換できない数値があります.」というエラーメッセージが表示され,変換処理が拒否されます.重複するキーを持つマッピングを入力した場合も,js-yamlのデフォルトの挙動に従ってパースエラーとなり,後の値で上書きされることはなく厳格に処理が中断されます.
これにより,意図しない値の消失を防ぐ設計となっています.
ネストと配列の具体例
階層構造を持つデータの変換において,本ツールはフロー配列,ネスト配列,配列内のオブジェクトなど,複雑な入れ子構造の相互変換に対応しています.入力データがJSONの配列である場合,YAMLへの変換時には各要素がハイフンから始まるブロックスタイルで展開されます.逆にYAMLのフロースタイル(ブラケットを用いたインライン表記)で配列を入力した場合,JSONへ変換される際には標準的なJSON配列へと整形されます.
具体例として,YAMLで「tags:」の下に改行とインデントを伴って配列を記述した場合,内部でプロパティtagsが配列を持つオブジェクトとして解釈され,JSON側では "tags": ["utility", "developer"] として出力されます.配列の各要素がさらにオブジェクトを保持する構造や,オブジェクトの値が別のオブジェクトである場合も,ツリーを再帰的に巡回しながら構造が復元されます.
ただし,これらのツリー構造をパース・展開する際には厳格な制限が適用されます.データの深さ(ネストの階層)が50を超過した場合や,トラバースする要素の合計訪問ノード数が50,000を超えた場合,「データの階層や展開量が処理上限を超えています.」という例外が送出されます.
また,YAMLのアンカーとエイリアスが自分自身を参照する循環を作っている場合,再帰処理の過程で祖先ノードとの重複が検知され,「循環参照はJSONに変換できません.」として処理がブロックされます.
コメント・アンカーの損失
テキストベースのデータ記述フォーマットであるYAMLとJSONを相互に変換する過程で,構造的な互換性を持たない一部のメタ情報は変換結果に維持されません.特に注意が必要なのが,コメント行とYAML特有のアンカーおよびエイリアス表現です.YAMLテキスト内にシャープ記号を用いて記述されたコメントは,js-yamlが文字列を値へとパースする段階で無視されます.
そのため,データとしての意味を持たないコメント文字列はオブジェクトツリーに格納されず,JSONへ変換した後のテキストには一切出力されません.同様に,JSONからYAMLへと逆変換する場合も,JSONの仕様上そもそもコメントが存在しないため,新たに生成されるYAMLに元の解説文が復元されることはありません.
また,YAMLでデータの重複定義を避けるために用いられるアンカーとエイリアス表現についてですが,本ツールではエイリアスを展開してJSONで表せる値のツリーを構築した上で出力を行います.そのため,YAML側で定義し別の場所で参照していた構造は,JSON側では単に同じ値を持つ別個のネストされたデータとして実体化してコピーされます.
さらに,JSONからYAMLへ変換する際には,noRefs: trueのオプションが指定されているため,重複するオブジェクト構造があった場合でも自動的にアンカー記号を使った参照表現に圧縮されることはなく,すべてのツリーがそのまま出力展開される仕様となっています.
エラーと処理上限
本ツールでは,ブラウザの実行スレッドを保護し,意図しない巨大データの展開による負荷を抑えるため,明確な境界値と処理上限が設定されています.操作者がテキストエリアに入力した文字データに対して,まず最初に文字数(UTF-16コード単位)の検査が行われます.入力長が100,000文字を超過した場合は即座に「入力は100,000文字(UTF-16コード単位)以内にしてください.
」という例外が投げられ,パース処理そのものが開始されません.パースが成功し,JavaScriptのオブジェクトとして展開された後には,再帰的なバリデーション関数が実行されます.ここでは,オブジェクトツリーの深さが50以内に収まっているか,全体の処理ノード数が50,000を超えていないかに加え,出力時に文字列化される予定のキー長および文字列値の長さの合計が追跡されます.
文字列の長さの累積値が1,000,000を超過した場合,「展開後の文字列が処理上限を超えています.」というエラーが発生し,処理が中断されます.さらに,最終的な変換結果のテキスト全体の長さが1,000,000文字を超過した場合も,「変換結果が1,000,000文字の処理上限を超えています.
」として出力がブロックされます.変換中にパースエラーや上限超過による例外が発生した場合,右側の出力エリアは空白となり,代わりに赤いアラートボックス内にエラーメッセージが明示されます.問題の箇所を修正してから再度「変換する」ボタンを押下することで,エラーが解除され正常な出力が得られます.
差分と実際の設定先での検証
変換によって得られたJSONまたはYAML文字列を利用する際には,出力テキストの仕様が利用先の設定ファイルやアプリケーションのパーサの要求に完全に合致しているかを,実環境で検証することが推奨されます.本ツールが出力するJSONは,常に2スペースのインデントで整形され,JSON.stringifyの仕様に基づきキーと文字列値がダブルクォーテーションで囲まれた標準的な書式となります.
一方で,YAMLとして出力する場合,js-yamlのdumpメソッドにlineWidth: -1とforceQuotes: trueが指定されています.これにより,長い文字列が含まれていても意図しない箇所での自動的な折り返し(改行)は発生せず,また文字列スカラーはすべてクォーテーションで囲まれた状態で出力されます.
これらの書式は機械可読性を重視した本ツールで採用する表現ですが,手動で記述された既存の設定ファイルと比較すると,クォートの有無や改行位置にフォーマット上の差分が生じる場合があります.また,数値型の精度についても注意が必要です.JavaScriptの数値はIEEE 754倍精度浮動小数点数として処理されるため,64ビット整数などの極めて大きな数値をJSONからYAMLへ変換する際,精度の欠損が生じ,下位の桁が丸められた状態の数値としてパースされる可能性があります.
このような巨大な識別子を扱うシステムへ設定値を渡す場合は,文字列として明示的に変換されているか,変換結果の文字列をコピーした後に設定先で正しく読み込まれるかを確認する工程が必要です.