構文コンバーターの機能
JSON、YAML、XML、TOML、CSV は同じものを保持しません。このページには、各形状がどのようにマッピングされるか、どの変換に損失が生じるか、ツールが何を拒否するかが正確に記載されています。
変換するもの
9 つの直接変換: JSON から YAML、YAML から JSON、JSON から XML、XML から JSON、JSON から TOML、TOML から JSON、YAML から TOML、TOML から YAML、JSON から CSV。どれもブラウザのタブで実行できます。何もアップロードされていません。
各変換は内部的には同じように機能します。つまり、ソース ドキュメントが通常の JavaScript 値に読み込まれ、その値がターゲット形式で書き出されます。 YAML から TOML への変換は特別なケースではなく、YAML リーダーの後に TOML ライターが続きます。そのため、以下の注意事項はペアごとではなく形式ごとに記載されています。TOML 日時に関する注意事項は、TOML が出現する場所に適用されます。
CSV は書き込み専用ですが、意図的にそうされています。 CSV を読み取るということは、区切り文字、引用符の方言、最初の行がヘッダーであるかどうか、すべてのセルの型を推測することを意味します。4 つの推測があり、コンバーターはそれぞれの推測を静かに間違えます。それは問いかけるツールの仕事です。
XML: 属性、配列、および選択したルール
XML には正規の JSON マッピングがないため、規則を選択する必要がありました。 XML が 2 つの形式のいずれかである場合には常に画面上に表示されます。これらは次のとおりです。
属性は、先頭に @ が付けられたオブジェクト キーになります。 <user id="7"><name>Ada</name></user> は、{"user":{"@id":"7","name":"Ada"}} と読み取られます。プレフィックスは、同じ名前の属性と子要素が 1 つのキーに折りたたまれないようにします。<user id="7"><id>other</id></user> は両方を保持します。
属性または子要素も持つ要素内のテキストは、キー #text の下に存在します。テキストのみを含む要素は、そのテキストに折りたたまれます。 CDATA セクションは #cdata の下にあるため、その内容はマークアップではなく目に見えるデータです。
繰り返される兄弟要素は配列になります。一度出現した要素名は配列にはなりません。XML では、パーサーは「1 つの項目を含むリスト」と「1 つの値」を区別することができず、コンバーターはその情報を作成できません。安定した形状が必要な場合、それはスキーマの議論であり、より賢いコンバーターの議論ではありません。
名前空間プレフィックスはそのまま保持されます。<ns:item> はキー ns:item で、xmlns:ns は属性 @xmlns:ns です。プレフィックスを解決すると、ドキュメントに実際に含まれていたテキストが破棄されるため、何も解決されず、書き換えられず、削除されません。
自己終了タグは空の文字列として読み取られます。 XML 宣言、処理命令、およびコメントは削除されます。逆に、ツールは独自の宣言を作成し、DOCTYPE は作成しません。
XML の書き込みでは、正当な XML 要素名ではないキー (スペースを含むキー、数字で始まるキー、xml という文字で始まるキー) は、暗黙的に書き換えられるのではなく、名前によって拒否されます。静かに名前が変更された要素は、何も検証しないドキュメントを生成します。
外部エンティティは無効化されるだけでなく拒否されます
XML ドキュメントでは、DOCTYPE でエンティティを宣言できます。これらを拡張するパーサーが XXE 脆弱性です。SYSTEM「file:///etc/passwd」と宣言されたエンティティはローカル ファイルを読み取り、URL を指すエンティティは攻撃者が制御するリクエストを作成します。内部エンティティの連鎖は、数百バイトをギガバイトに変える「十億の笑い」サービス拒否です。
このコンバータは、DOCTYPE を考慮するようにパーサーを構成しません。パーサーに 1 バイトが与えられる前に、これを含む文書はすべて拒否され、拒否をオフにするオプションはありません。これにより、保証は依存関係のデフォルト設定ではなく、コードのプロパティになります。そして、デフォルトはバージョン間で変わり、私たち自身の拒否は、すべての標準 XXE ペイロードをフィードし、何もフェッチされず、何も拡張されなかったことを主張するテストによってカバーされるため、違いは重要です。
実際のコスト: DOCTYPE を持つドキュメントは、たとえ無害であっても、ここでは変換されません。コンテンツが自分のものである場合は、DOCTYPE を削除します。
TOML 日時には同等のものは他にありません
TOML 1.0 には 4 つの時間型があり、JSON、YAML、および XML にはありません: オフセット日付/時間 (1979-05-27T07:32:00Z)、ローカル日時 (1979-05-27T07:32:00、意図的にゾーンなし)、現地日付 (1979-05-27)、現地時間(07:32:00)。
それぞれは書かれたとおりの RFC 3339 文字列になり、変換により、どの値にその値が適用されたのか、およびそれぞれが 4 種類のうちのどれであったのかがわかります。代替案 (4 つすべてに対して 1 つの UTC インスタントを発行する) では、ドキュメントが明示的に述べることを拒否したゾーンに現地時間を移動することになりますが、これは損失を伴うというよりも間違った答えです。
逆変換すると、日付時刻ではなく引用符で囲まれた文字列が生成されます。したがって、TOML から JSON への TOML の往復により、それらの値の型が変更されます。これを回避するには、受信側ツールが共有する必要がある規約を作成する以外に方法はありません。黙って作成するのはさらに悪いことです。
TOML 整数は符号付き 64 ビットです。 JSON 数値は IEEE-754 の double です。 2^53 ~ 1 を超える整数は、気付かないほどの丸めによって最後の桁が失われるのではなく、警告で指定されたパスを含む文字列になります。
TOML には null がありません。 null キーは出力から省略され、警告で名前が付けられます。配列内の null は空の文字列になります。これを削除すると、以降のすべてのインデックスがシフトされるためです。 TOML ドキュメントのルートは常にテーブルであるため、ルートにある配列または裸の値は、その理由を示す文とともに拒否されます。
YAML: アンカー、ストリーム、ノルウェー問題
YAML は、文字列、数値、ブール値、null、リスト、マップのみを生成できる制限されたスキーマで読み取られます。任意のオブジェクト (!!js/function、!!python/object/apply、!!binary) を構築するタグは拒否されます。これが制限が存在する理由のすべてです。これらを尊重するローダーは、構成ファイルの皮をかぶった任意のオブジェクト コンストラクターです。
アンカーとエイリアスは、繰り返しデータに解決されます。エイリアスに従うと 100 万を超える値を展開するドキュメントは、タブのフリーズが許可されずに拒否されます。再帰的なエイリアスは完全に拒否されます。これは、他の形式でサイクルを表現できないためです。
--- で区切られた複数のドキュメントのストリームはドキュメントの配列になり、変換によってそのことがわかります。このツールの他の形式にはストリームがないため、配列が唯一の正確なマッピングになります。
YAML はマッピング キーの繰り返しを禁止しており、各パーサーはマッピング キーを異なる方法で処理します。このツールは、ルール JSON.parse が使用する最後の値を保持し、それが発生したことを繰り返しの位置とともに通知します。文書を黙って破棄することはさらに悪いことです。何も言わずに黙って値を選択すると、さらに悪いことになります。
ノルウェーの問題: YAML 1.1 では、引用符で囲まれていないスカラー y、yes、on、no、off および国コード NO はすべてブール値に解決されます。これにより、国コードのリストが true と false のリストに変わります。このツールは YAML 1.2 を読み取ります。ここで true と false のみがブール値であるため、NO は文字列 NO のままです。 YAML を書き込むとき、1.1 パーサーが誤って読み取るすべての文字列 ('NO'、'yes'、'on'、'1.0'、'0755'、'2001-12-14') を引用符で囲むため、出力は安全です。 1.2 に移動していないツールにフィードします。それにはいくつかの引用文字が必要であり、正確性が損なわれます。
数字のように見える文字列も同じ理由で引用符を保持します。「0755」は 755 にならずに文字列のままであり、「1.0」は 1 にならずに文字列のままです。
コメントはあらゆる方向で失われます。 JSON、CSV、その他は保存する場所がなく、戻ってどこに行けばよいかを推測する方法もありません。
JSON から CSV へ: フラット化と数式を停止するアポストロフィ
配列は行となり、要素ごとに 1 つのレコードになります。配列を保持する 1 つのプロパティを持つオブジェクトは、その配列を行として使用します。これは、{"users": [ ... ]} は圧倒的にラベル付きのテーブルであるためであり、変換によってそれが行われたことがはっきりと示されます。その他のオブジェクトは単一行です。裸の文字列、数値、または null は拒否されます。四角形にはレコードが必要です。
ネストされたオブジェクトと配列は、オブジェクト キーと配列インデックスの両方にドットを使用して、ドット付きの列名 (address.city、tags.0、tags.1) にフラット化されます。 1 つの区切り文字、1 つのルール。すでにドットが含まれているキーは、ネストされたパスにより列名が曖昧になります。このツールは、スプレッドシートが理解できないエスケープ スキームを発明するのではなく、警告します。
キーは、最初に見つかった順序ですべての行にわたって結合されます。フィールドが欠落している行は、シフトされた列ではなく空のセルを取得し、変換によって行が不揃いであることが警告されます。空のオブジェクトまたは空の配列は、消滅するのではなく、独自のパスの下にある 1 つの空のセルになります。
引用符は RFC 4180 に従います。区切り文字、二重引用符、CR または LF を含むフィールドは二重引用符で囲まれ、埋め込まれた引用符は 2 回書かれます。レコードは CRLF で区切られます。先頭または末尾に空白があるフィールドも引用符で囲まれます。それ以外の場合は、スプレッドシートが自動的に削除するためです。 Unicode は変更されずに通過し、UTF-8 を読み取る必要があるスプレッドシートにバイト オーダー マークをプレフィックスとして付けることができます。
フォーミュラーインジェクションは噛むものです。 =、+、-、@、タブ、またはキャリッジ リターンで始まるセルは、ファイルを開いた瞬間に Excel、LibreOffice Calc、Google Sheets によって数式として実行されます。 =cmd|'/c calc'!A1 は誰もが引用するデモです。 =IMPORTXML(...) は、シートをどこかに静かに送信するものです。このような文字列をそのまま書き込むコンバーターは、あなたのデータを不活性に見えるファイル内で他の誰かのコード実行に変換します。
そのため、これらの文字のいずれかで始まるテキスト セルにはアポストロフィが接頭辞として付けられます。これは、主要なスプレッドシートではすべて「これはテキスト」として読み取られ、セルには表示されません。数値はそのままです。数値 -5 は数式ではなく数値です。エスケープされたセルの数が報告され、エスケープをオフに切り替えることができます。その場合、ツールはオフにした内容を明確に表示します。
CSV では空の文字列と null を区別できません。どちらも空のセルになり、変換では null がカウントされるため、変換が行われたことがわかります。
限界と限界に達すると何が起こるか
すべての形式には文字の上限があり、パーサーがダウンロードされる前に適用されます。JSON の場合は 8 百万、XML と CSV ソースの場合は 4 百万、YAML と TOML の場合は 2 百万です。さらに、ツールは、貼り付けた内容を失う応答しないタブになるのではなく、正確な番号で拒否します。
さらに、CSV 出力は 100,000 行と 2,000 列に制限されます。これは、深くネストされた配列が要素ごとに 1 列に平坦化され、数メガバイトの JSON がテーブルになり、スプレッドシートが開かない可能性があるためです。
空および空白のみの入力は、null または空のドキュメントに変換されるのではなく、空として報告されます。無効な構文は、4 つの読み取り可能な形式すべての行と列で報告されます。
パーサー自体は、変換で必要な場合にのみダウンロードされます。 JWT をデコードするためにツールキットを開いても、それらは何もフェッチされません。
貼り付けたものはどうなりますか
- すべての変換、ハッシュ、デコード、差分はブラウザーのタブで実行されます。ページが読み込まれるとサーバーは関与しないため、入力はサーバーにアップロード、記録、または保存されません。
- ハッシュはブラウザー独自の Web Crypto 実装から取得され、UUID は暗号的に安全なランダム ジェネレーターから取得されます。どちらもネットワーク通話を必要としません。
- 入力した内容はローカル ストレージや Cookie に書き込まれません。ページをリロードするとページは破棄されます。タブを閉じると破棄されます。
- サイト全体の分析は、構成された正規実稼働ホスト上でのみ実行され、プライバシー ポリシーで開示されます。ローカルホストとプレビューホストはそれを拒否します。貼り付けられた値、トークン、URL、およびファイルの内容は、ToolAcre 独自の分析イベントから除外されます。現在の構成では広告は無効になっています。
- つまり、JWT または API キーはライブ認証情報です。安全な習慣は、この主張を含め、その主張がどれほど信頼できるものであっても、自分が書いていない Web ページに貼り付けることは決してしないことです。
質問
XML ドキュメントが「DOCTYPE を宣言している」というエラーで失敗するのはなぜですか?
これには文書型宣言が含まれており、このコンバーターはエンティティを安全に処理するためのパーサー設定を信頼するのではなく、それらすべてを拒否するためです。コンテンツが自分のものである場合は、DOCTYPE を削除します。それを許可するという選択肢はありません。
TOML 日時が引用符で囲まれた文字列として返されるのはなぜですか?
JSON、YAML、XML には日付型がないためです。日時は、それが記述された RFC 3339 テキスト (他のすべての形式の文字列) に変換されました。したがって、逆に変換すると文字列が生成され、ツールは後でそれを知るのではなく、文字列が発生した瞬間に警告します。
CSV セルの 1 つがアポストロフィで始まるのはなぜですか?
そのテキストは =、+、-、@、タブ、またはキャリッジ リターンで始まり、ファイルを開いたときにスプレッドシートがそのようなセルを数式として実行するためです。アポストロフィはセルをテキストとしてマークします。セルが読み取られると、それは値の一部ではなくなります。エスケープをオフに切り替えると、ツールがそれが何を意味するかを教えてくれます。
単一の繰り返し XML 要素が配列ではないのはなぜですか?
XML には、1 つの値のリストと 1 つの値を区別する方法がないためです。どちらも同じように書かれています。どちらの方向に推測しても半分は間違っているため、ツールは実際に存在するものを報告します。
ここで CSV を JSON に変換できますか?
いいえ。CSV を正しく読み取るには、区切り文字、引用符の方言、最初の行がヘッダーであるかどうか、すべてのセルの型を決定する必要があります。 4 つすべてが静かに間違っていると推測するコンバーターは、最悪の間違い方です。質問する CSV ツールを使用します。
"NO" が false に変換されないのはなぜですか?
その動作は YAML 1.1 に属し、このツールは YAML 1.2 を読み取るため、true と false のみがブール値です。 1.1 の動作が、ノルウェーの国コードが構成管理においてジョークとして扱われる理由です。ツールは YAML を書き込むときにそのような文字列を引用符で囲むため、ダウンストリームの 1.1 パーサーが文字列を誤って読み取ることはありません。
制限事項
- CSV は書き込まれますが、読み取られることはありません。ここでは、選択により CSV から JSON への変換は行われません。
- コメントは、コメントが存在するあらゆる形式で、あらゆる方向で失われます。
- TOML 日時は他のすべての形式の文字列になるため、TOML ラウンドトリップによってこれらの型が変更されます。ロスのないパスは存在しません。
- DOCTYPE を含む XML ドキュメントは、無害なものも含めて完全に拒否され、拒否をオフに切り替えることはできません。
- 単一の繰り返し XML 要素は、繰り返しのない XML 要素と区別できないため、XML から JSON へ、さらに XML を変換しても、必ずしも元の形状が返されるわけではありません。
- XML 混合コンテンツ (子要素とインターリーブされたテキスト) では、子要素に対する相対的なテキストの位置が失われ、ラウンドトリップできません。
- XML は型を宣言しないため、型推論がオンになっていない限り、XML 値は文字列になります。推論がオンの場合、"0755" と "NO" は通常の誤読の対象となります。
- TOML には null がありません。null キーは TOML 出力から削除され、配列内の null は空の文字列になります。
- TOML ドキュメントのルートはテーブルである必要があるため、JSON 配列またはスカラーを TOML に変換することはできません。
- JSON 番号は IEEE-754 の倍精度浮動小数点数です。 2^53 を超える整数は、暗黙的に丸められるのではなく文字列に変換され、型が変更されます。
- CSV は空の文字列と null を区別できません。どちらも空のセルとして書き込まれます。
- CSV フラット化では、オブジェクト キーと配列インデックスの両方にドットが使用されるため、すでにドットが含まれているキーでは、警告は出されますがエスケープされないあいまいな列名が生成されます。
- YAML アンカーとエイリアスは保存されずに解決されます。出力にはアンカーがなく、ターゲット形式がサイクルを表現できないため、再帰的エイリアスは拒否されます。
- 入力は形式ごとに制限されており (JSON の場合は 8 百万文字、XML の場合は 4 百万文字、YAML および TOML の場合は 2 百万文字)、サイズを超えるドキュメントは処理が遅くなり拒否されます。
- ここではスキーマに対して検証するものは何もありません。ドキュメントはきれいに変換されても、その目的に対して間違っている可能性があります。