開発者ツール · 構文コンバーター
YAML JSON 変換で失われる機能: コメント、アンカー、タグ
· 仕組み
yaml json データ形式
YAML には、コメント、アンカー、エイリアス、マージキー、タグ、およびマルチドキュメントストリームがあります。 JSON にはそれらがありません。この記事では、コンバーターがそれぞれの機能で何を行うのか、また変換を元に戻しても元のファイルが復元されない理由について説明します。
ファイルはさらに長く、コメントも何もなく戻ってきました。YAML 構成は JSON に変換され、また元に戻り、生き残らなかったものはすべて戻ってきました。
すべてのコメントが消えた後でも、YAML ファイルが JSON から返されるまでの時間が長くなります。 1 つのマッピングを共有するアンカーは、繰り返されるオブジェクト データに解決されるため、シリアライザーは各コピーを独立して書き込みます。値はまだ一致しているかもしれませんが、オーサリング構造と説明は失われています。
そのため、YAML ~ JSON ~ YAML の往復は、ソースの保存ではなく、データ変換として判断される必要があります。 ToolAcre は、制限された値のグラフを読み取り、新しいドキュメントを書き込みます。コメント、アンカー名、引用の選択肢、またはブロックスカラー表現を含む具体的な構文ツリーは決して保持されません。
コメント — JSON にはコメントを入れる場所がなく、変換後に # 行すべてが失われる理由
JSON にはコメント ノードがないため、コメントは YAML パーサーによって破棄されます。 `#` で始まる行は、タイムアウトが存在する理由やサービスの所有者を説明できます。一度削除されると、どのアルゴリズムも文言や配置を推測できなくなります。逆変換すると、その操作コンテキストなしで有効な YAML が作成されます。
元のファイルをバージョン管理に保存し、置き換える前に差分を確認してください。解決された値を検査することだけが目的の場合は、JSON が便利です。コメントを保持しながら再フォーマットすることが目的の場合、この汎用値コンバータは間違った表現になります。
アンカーとエイリアス — &default と *default が繰り返しコピーに展開され、その結果ファイルがどのように増大するか
アンカーとエイリアスは安全制限内で受け入れられ、解決されます。 `base: &b {x: 1}` と `copy: *b` は、`x: 1` を含む 2 つのオブジェクト パスになります。出力 YAML は `noRefs` を使用するため、共有オブジェクト ID は新しいアンカーを作成しません。繰り返される値が残ったとしても、コンパクトな関係は失われます。
JSON はサイクルを表現できないため、再帰的なエイリアスは拒否されます。エイリアスの拡張は、エイリアスの数、ネスト、および拡張されたノードの測定によって制限されます。 100 万を超える値に文字列化される短いドキュメントは停止されます。これにより、任意の YAML サポートを要求せずにタブが保護されます。
マージ キー — YAML 1.1 の <<: 規則、それをサポートするパーサーがマージされたマッピングを平坦化する方法、およびそれをサポートしないパーサーで何が起こるか
アウトラインでは、YAML 1.1 マージ キーがフラット化されていることを前提としています。 ToolAcre は、js-yaml の JSON またはコア スキーマのみを読み込みますが、どちらもマージ タイプを有効にしません。これらのスキーマでは、`<<` キーはマッピングをマージする命令ではなく、通常のデータです。したがって、フラット化されたマージを出荷時の動作として提示することは false になります。
ソースがマージ キー セマンティクスに依存している場合は、その規則を所有するアプリケーションでそれを解決するか、変換前に値を明示的に書き換えます。通常の `<<` の値として使用されるエイリアスは引き続きオブジェクトに解決される可能性がありますが、キーは `<<` のままです。これは、そのメンバーを親にマージすることと同じではありません。
このコンバーターに同梱されている 2 つの制限付きスキーマではマージ キーが有効になっていません
制限付きスキーマで認識される標準の明示的タグでは、`!!str` や `!!int` などの基本タイプを選択できます。バイナリ、タイムスタンプ、セット、順序付きマップ、JavaScript 関数、Python オブジェクト コンストラクターなどのカスタム タグやリッチ タグは拒否されます。これらは文字列化されず、決して実行されません。
`---` で区切られた YAML ストリームが受け入れられます。 1 つのドキュメントが 1 つの値になります。いくつかは、ドキュメント数を指定する警告を含む配列になります。末尾の区切り文字により、選択したスキーマに従って空の最終ドキュメントを作成できます。ここのターゲットにはストリーム モデルがないため、配列は宣言された規則になります。
安全でないタグは拒否されます。複数のドキュメント ストリームが配列になる
再試行とタイムアウトには `defaults: &d` を使用し、タイムアウトを説明するコメントを付けてから、 `service:` を `inherited: *d` とともに使用します。 JSON には、デフォルトと繰り返し継承されたオブジェクトの両方が含まれます。コメントとアンカー名はありません。その JSON を逆変換すると、アンカー関係ではなく 2 つのマッピングが生成されます。
`---` の後に別のドキュメントを追加すると、JSON ルートがドキュメントの配列になります。 `!!binary` を追加すると、変換は制限付きスキーマ ヒントで停止します。これら 3 つの変更は、解決されたサポートされたデータ、構造上の規則、および完全にサポートされていない構築を区別します。
これでカバーされないもの — キーの順序と引用スタイル。通常は存続しますが、どちらの形式でも保証されません
通常のオブジェクトの挿入順序は表示されたままになることがよくありますが、これはソース スタイルの保存ではなく、ソート キーを選択すると意図的に変更されます。引用符、フロー スタイルとブロック スタイル、スカラー スペルおよびコメントは残りません。重複したマッピング キーは、両方の無効なエントリを保持するのではなく、警告とともに最後の値を保持します。
ライターは、YAML 1.1 消費者が読み間違える可能性のある値を引用符で囲むことによってあいまいな文字列を保護しますが、その安全な選択は作者の元のスタイルとは異なる場合があります。データの同等性は、通常の JSON 型の値に対する防御可能なテストです。テキスト上の平等はそうではありません。
キーの順序は維持される可能性がありますが、コメント、アンカー、タグのスペル、スタイルは保持されません。
YAML-to-JSON は、JSON 型の値 (コメント、エイリアス、サポートされていないタグ、ストリーム境界など) の外側に意味が存在する場合は常に損失を伴います。 ToolAcre はいくつかの損失を可視化し、危険な構造や周期的な構造を保存するふりをするのではなく拒否します。
ワークフローを採用する前に、代表的なファイルを変換します。警告を検査し、解決された値を比較し、作成された YAML を保持します。このパネルは、パーサーが認識するものについての優れたレンズですが、コメントを保持するエディターや完全な YAML オブジェクト モデル トランスフォーマーではありません。
移行レビューでは、値の変更をソースのみの変更から分離します。 JSON の詳細な比較では、通常の値が存続しているかどうかを確認できますが、テキストの差分では、必然的に変更されたコメント、アンカー、スタイルが明らかになります。どちらのチェックも他のチェックを置き換えることはありません。値の比較をロスレスと呼ぶと、ソース情報が無視されます。すべてのテキスト変更を呼び出すと、データ障害が発生し、有効な再シリアル化が無視されます。