YamlBox

データコンバーター · 6 分で読みました

XML から JSON: すべてのコンバータが行う必要がある決定

XML と JSON はどちらもツリーであるため、それらの間の変換は簡単なはずですが、XML から JSON への変換では、毎回異なる結果が生成されます。これは、XML には、属性、混合テキストと要素、名前空間、同じタグが 1 回または 1000 回出現するドキュメントなど、JSON にはない情報が含まれるためです。優れたコンバーターは、これらの選択を非表示にするのではなく、明示的に行います。

更新されました

コンバーターが回避できない曖昧さ

`<items><item>x</item></items>` を考えてみましょう。 `item` は文字列であるべきですか、それとも文字列のリストであるべきですか? XML には何も書かれておらず、その違いはコードを作成した瞬間に重要になります。コンシューマは単一要素の応答で常に配列が中断されることを期待し、コンシューマは 2 番目の項目が到着したときにオブジェクトが中断されることを期待します。成熟したコンバータでは、実稼働環境に到達するのに十分なだけ推測が正しいことが多いため、黙って推測するのではなく、既知のリスト要素の配列を強制できます。

属性には命名規則が必要です

JSON には属性がないため、属性は兄弟キーまたはネストされたオブジェクトになる必要があります。広く使用されている規則では、属性名に `@` が付けられます (`<image src="a.png"/>` は `{"@src": "a.png"}` になります)。一方、要素に属性とコンテンツの両方がある場合、要素テキストは `#text` などの予約キーに入ります。コンバーターがどのような規則を使用する場合でも、その規則を一貫して適用する必要があります。これは、半分変換された XML は未変換の XML よりも悪いためです。

                <rss version="2.0"><channel><title>Feed</title></channel></rss>
→ {
  "rss": {
    "@version": "2.0",
    "channel": { "title": "Feed" }
  }
}
              

名前空間

名前空間付きドキュメント - SOAP サービス、サイトマップ、Office 形式 - 要素名は `ns:element` として修飾されます。 JSON に相当するものがないため、コンバータはプレフィックスを削除するか、それをキーの一部として保持するか、名前空間 URI を中心にドキュメントを再配置します。 2 つの名前空間が同じローカル名を使用している場合、これを削除するのが一般的ですが、場合によっては悲惨な結果になることがあります。ドキュメントで名前空間が使用されている場合は、出力を信頼する前に衝突がないか確認し、キーにプレフィックスを保持することを優先します。

この変換が実際に使用される場所

  • RSS および Atom フィード — 変換後は、JavaScript でフィードを読むことがはるかに簡単になります。
  • SOAP とレガシー API — 応答を最新のクライアントが消費できるものに変換します。
  • サイトマップと構成ファイル — スキーマを理解できるエディターを使用せずに構造を検査します。
  • データ移行 — XML 時代のシステムから JSON ベースのシステムにレコードを移動します。

往復の忠実性は神話です。 XML を JSON に変換したり、その逆に変換したりすると、宣言順序、空白、コメント、CDATA が存続しないため、元のドキュメントのバイト単位が返されることはほとんどありません。バックアップ戦略としてではなく、他の場所でデータを使用する必要がある場合に変換します。

まず検証してから変換する

XML パーサーは、閉じられていないタグと無効なエンティティに対して厳密であり、エラー メッセージは通常正確です。変換する前にドキュメントを修正してください。保持する価値のある JSON 構造を取得するには、整形式の入力が唯一の方法です。変換はブラウザ内でローカルに実行されます。これは、XML が顧客のエクスポートまたは内部サービスの応答である場合に重要であり、オフラインでも動作し続けます。

XML ~ JSON — よくある質問

XML から JSON が異なるツールで異なる形状の出力を生成するのはなぜですか?

XML には、JSON では直接表現できない属性、名前空間、繰り返し要素が含まれるため、各ツールは規則 (属性には `@`、コンテンツには `#text`、既知のリストには配列) を選択します。どの規則を選択するかよりも、一貫したツールを使用することが重要です。

繰り返される XML 要素は JSON でどのように表されますか?

配列として、通常は複数回出現する要素に対して無条件に使用されます。単一の出現は、その要素の配列を強制しない限り、オブジェクトのままになる可能性があります。繰り返す可能性のあるものに対しては、これがより安全な選択です。

SOAP 応答を JSON に変換できますか?

はい、ただし、ほとんどのコンシューマー コードが必要としない名前空間とエンベロープ構造が含まれます。変換し、エンベロープをアプリケーションに渡すのではなく、結果を実際に必要なペイロードに整形します。

この投稿で言及されているツール

19 ツールの完全なリストを参照する

さらに読む記事

6 分で読みました

YAML から JSON: 迷うことなく構成を変換

マルチドキュメントのサポートと正確なエラー位置を使用して、ブラウザで YAML を JSON に変換します。さらに、CI パイプラインを静かに破壊する YAML の間違いも含まれます。

すべての 19 投稿 →