日本語

開発者ツール · 構文コンバーター

4 つのデータ モデルの比較: JSON、YAML、TOML、XML が 1:1 をマップしない理由

· 背景

データ形式 json yaml

制約のあるコンバージョン ハブで出会う 4 つの異なるデータモデル形状
オリジナル ToolAcre ベクトル イラスト

これらの形式間のすべての変換は、それぞれが異なるデータ モデルを中心に設計されているため、どこかで損失を伴います。この投稿では、変換によって何が保持され、何が削除されるかを予測できるように、それらの型システムと構造を比較します。

ラウンドトリップしない構成 — 3 つの形式を通じて変換されたファイルと、異なるフィールドが返された

安全な数値、文字列、ブール値、配列、およびネストされたオブジェクトを含む通常のオブジェクトは、JSON-to-YAML-to-JSON および JSON-to-TOML-to-JSON テストに耐えることができます。 TOML の前に null、TOML からの日時、混合 XML コンテンツまたは YAML コメント、および一部の値またはソース情報の変更を追加します。

有益な質問は、変換が普遍的に不可逆であるかどうかではありません。それは、どの入力クラスとどの方向で必要なプロパティを保持するかです。 ToolAcre の警告と拒否により、すべてのペアを 1 つのマーケティング上の約束に限定するのではなく、そのマトリックスが観察可能になります。

代表的な構成は一部のペアをラウンドトリップできますが、サポートされているすべての形状をラウンドトリップできるわけではありません

JSON は、このパーサーで null、ブール値、数値、文字列、配列、およびオブジェクトを提供します。コメント、日時型、共有参照構文はありません。 JavaScript は数値を IEEE-754 の 2 倍として解析するため、すでに引用符で囲まれていない整数が安全な範囲を超えている場合、別の作成者がそれを認識する前に精度が失われる可能性があります。

オブジェクト キーは文字列であり、オプションの並べ替えによりその表示が変更されます。配列は順序付けされたままになります。厳密な解析により、コメント、末尾のカンマ、および非有限数値トークンが拒否され、他のリーダー用のコンパクトなベースラインが確立されます。

JSON この JavaScript 実装で使用される値モデル

ToolAcre は、制限付き JSON またはコア スキーマを通じて YAML を受け入れます。アンカーとエイリアスは解決され、コメントは消え、ストリームは配列になり、重複キーは警告付きで最後の値を保持し、再帰的または爆発的なエイリアスは拒否されます。

カスタム タグ、バイナリ、タイムスタンプ、セット、および言語オブジェクト コンストラクターは拒否されます。 Core Infinity と NaN はターゲット フォーマットで null になり、警告が表示されます。これは意図的に YAML の広範なタグ システムのサブセットであり、YAML オブジェクトの完全なサポートを主張するものではありません。

ToolAcre が受け入れる制限付き YAML モデル

TOML はテーブルで始まり、文字列、符号付き整数、浮動小数点数、ブール値、配列、テーブル、および 4 つの一時的な種類をサポートします。 null はありません。 ToolAcre は、桁を失うことなく、日付と時刻をソース指向の文字列に変換し、ワイド整数を 10 進数の文字列に変換します。

TOML を書き込む場合、null オブジェクト キーは省略され、null 配列エントリは空の文字列になります。ルート配列とスカラーは拒否されます。コメントと、ヘッダー、ドットキー、インラインテーブルの中からの作成者の選択は、プレーンな値では返されません。

TOML のルート テーブル、テンポラル値、および NULL 境界

XML は、`@` 属性、通常の子キー、`#text`、`#cdata`、反復兄弟配列、およびリテラル名前空間プレフィックスを含むツリーとして投影されます。コメント、宣言、および処理命令は削除されます。混合テキストの位置は失われ、繰り返しが現れるまでは 1 対多数を知ることができません。

推論が選択されていない場合、値は文字列として読み取られます。 JSON から書き込まれた Null は空の要素になり、返されたときに空の文字列と区別できません。すべての DOCTYPE は拒否され、無効な名前は書き換えられずにシリアル化を停止します。

ToolAcre の XML プロジェクション: 要素、属性、テキストおよびリテラル接頭辞

9 方向に発送: JSON から YAML、XML、TOML、CSV。 YAML ~ JSON および TOML; TOML ~ JSON および YAML; XML から JSON まで。 JSON 型の通常の値は、JSON と YAML の間で最もよく機能します。 TOML では、日付と null 境界が導入されます。 XML では、命名規則とノード カテゴリ規則が必要です。

CSV はフラットな外れ値であり、出力のみです。配列または選択したオブジェクトは行になり、ネストされたパスは点線の列に平坦化され、空のテキストとの null マージおよび数式のような文字列は無効化されます。 CSV-to-JSON、XML-to-TOML、およびその他の存在しないペアは、推論されずに拒否されます。

9 つの出荷方向の互換性マトリックス (出力として CSV のみ)

バイナリ形式とスキーマ言語は範囲外です。スキーマはリストのカーディナリティを復元したり、ビジネス シェイプを検証したりできますが、バイナリ エンコーディングでは、ここでは表されていないバイト レベルの型やフレーミングが導入されます。コンバーターはそれらの機能を決して主張しません。

また、構文変換はアプリケーションの正当性を証明しません。クリーンな Kubernetes 形式の YAML、XML 注文メッセージ、または TOML プロジェクト ファイルでも、ターゲット コントラクトに違反する可能性があります。構文マッピングを検査した後、ドメイン バリデータを使用します。

要点: モデルを選択してから構文を選択し、変換をコミットする前に構文コンバーター パネルで変換をテストする方法について説明します。

句読点を選択する前にデータ モデルを選択してください。コメントとエイリアスが重要な場合、JSON ホップはそれらを保持できません。 null が重要な場合は、TOML 出力によって変更されます。順序付けられた混合コンテンツが重要な場合、プレーンな JSON プロジェクションでは不十分です。宛先がテーブルの場合、ネストされた JSON には明示的なフラット化規則が必要です。

ToolAcre を使用して 1 つの代表的なドキュメントをテストし、すべての警告を確認します。結果は、具体的なペアと入力に関する証拠であり、すべての変換をロスレスまたはサポートされているすべてのパーサーを完全と呼ぶ許可ではありません。

サービスにとって重要な境界 (null、空のテキスト、大きな識別子、日付のような文字列、1 つの繰り返しレコード、YAML が関係する場合はコメントまたはエイリアス、XML が関係する場合は混合テキスト) から代表的なドキュメントを構築します。サポートされている各ホップの後に正規化された値を比較し、結果に関する警告を保持します。この行列は、使い慣れた構文に対する漠然とした好みではなく、選択したモデルの意思決定成果物になります。