web-dev-qa-db-ja.com

データ交換におけるXMLとJSONの違い

XMLとJSONの違いについて疑問に思っています。

既存の処理ツールやバックエンドシステムを考慮せず、単にデータを表現する手段として、JSONがXMLよりも優れている、またはその逆はありますか?または、両方を同じ程度に使用できますか?

つまりXMLで表現できない、またはその逆でJSONで表現できるものはありますか?

1
scrineym

XMLとJSONはどちらも同じデータを送信できますが、どちらを使用するかによりますが、どちらを使用するかは、ほとんどの場合異なります。

これは既存のツールに影響を与えますが、どちらも手動でローリングするパーサーではない可能性が高いため、関連性があります。

[〜#〜] xml [〜#〜]

  • スキーマを検証するための優れたツールがあります。
  • 名前空間のサポートが組み込まれています。
  • より簡単にHTMLに再構成できます。
  • 非常に優れたクエリ言語であるXPathを使用してクエリを実行できます。SQLfor XMLとお考えください。 JSONに相当するものは実際には見たことがありませんが、これが間違っている場合は、ぜひ聞いてみたいと思います。

[〜#〜] json [〜#〜]

  • セレモニーが大幅に低い(そして、少なくとも私の経験では、きれいなプリンターが優れている)ため、人間が見なければならない場合は読みやすくなります。
  • 当然のことながら、転送の一端がJavaScriptで記述されている場合は、これが最適な形式です。
  • レガシーが少ないため、不正な形式のJSONを受け入れざるを得ない可能性が低くなります。また、不正な入力を受け入れる必要があるという文化的な期待もありません。

1つは他に格納できるすべてのものを格納できるため、使いやすさとツールは、それらの使用方法を比較するのに役立つ唯一の基準です。

If消去されたものすべて、おそらくどちらも使用せず、データをLISPのチャンクとして送信します。

これは、JSONよりもかろうじて(かろうじて)、XMLよりもはるかに簡単に変換でき、どちらの場合よりもパーサーを簡単に作成できます(すべてのツールがなくなった場合に行う必要があります)。

9
Morgen

XMLはeXtensible Markup Languageです。それは理解することが重要です:それは本質的にHTML(ドキュメントマークアップ言語)のように設計されていますが、もう少し形式化されています。問題は、ドキュメントのマークアップが誰もが使用するものではないことです。データストレージとデータ交換のために人々が悪用しますが、データストレージはドキュメントマークアップのようなものではないため、これは非常に悪い考えです。

一般的なHTMLドキュメントのコンテンツ対マークアップ比率はかなり高くなっています。たとえば、たまに<p>を超えて単一のタグを挿入する必要なく、ページ全体を書き込むことは十分に可能です。しかし、データストレージでは、すべてのデータ要素を何らかの正式な方法で定義する必要があります。 XMLを使用すると、すべてが非常にすばやくタグのスープの混乱に変わります。例えば:

一部の人々は、問題が発生したときに「わかっている、XMLを使用する」と考えています。

<Problem:Worsening> <Problem:TimeDescription>Now</Problem:TimeDescription> <Problem:Posessive>they have</Problem:Posessive> <Problem:Quantity>many, many</Problem:Quantity> <Problem:WorseningDescription>more problems</Problem:WorseningDescription> </Problem:Worsening>

コンテンツが非常に簡単に非常に簡単に終了し、すべてのタグによって完全に溺死することがわかります。 (これは、XMLがきれいに印刷されている場合でも同じです。)

また、XMLでは、すべての<tag>を対応する</tag>で閉じる必要があります。また、タグを厳密なLIFO(つまり、スタック)の順序で閉じる必要があります。これは冗長です。閉じるのに有効な唯一のタグが、まだ閉じていない最後のタグである場合、理論的には、すべての終了タグを単純な</>にして、セマンティック情報を失わないようにすることができます(きれいに印刷しなかったとしても、きれいに印刷されていないXMLを読み込もうとする人は難しいでしょう)とにかく?)これにより、XMLファイルが必要以上に大きく、かさばります。

XML DOMモデルも非常に複雑です。手始めに、ノードのサブデータを表す方法は2つあります。開始タグとその終了タグの間のノードと、開始タグ内の属性です。繰り返しになりますが、これはドキュメントマークアップ(<a href="http://example.com">)で大いに意味のあるアイデアですが、データストレージでははるかに少なくなります。次に、名前空間、スキーマと検証、XSLTなど、あらゆる種類の追加の複雑さがあります...

XMLとJSONの主な違いは、JSONが単なるデータストレージ形式であることです。ドキュメントのマークアップではなく、シリアル化されたデータを表現するために最適化されているため、シリアル化されたデータを表現するのにはるかに優れています。ダグラス・クロックフォードはそれを "XMLの無脂肪の代替物"と呼んでいます。

本当に興味深いのは、実際に電力を失うことなくこれを行うことができることです。スキーマと検証が必要ですか? JSONスキーマを使用します。クエリ?そのためのJSONPathがあります。 (一方で、これらのことを気にしない場合は、プログラムを膨らませるためのコードは必要ありません。)コメントや名前空間、さらには属性が必要ですか? {"namespace": "MyNamespace", "attributes": {"attrib1": "value1", "attrib2": "value2"}, "data": "Insert content here", "comment": "It's that simple"}

元の質問に答えるには、どちらのシステムでも表現できるデータはありませんが、他のシステムでは表現できません。 JSONはデータストレージ用に特別に設計されており、XMLはそうではないため、JSONではほとんど常に小さくてすっきりしています。 「仕事に適したツールを使用する」という単純な問題です。

5
Mason Wheeler

少しリンゴとオレンジです。どちらも同じタスクで使用されますが、明らかに異なります。

XMLはExtensible Markup Languageです。これの主な利点は、メタデータを保持できることです。要するに:

<tag attribute="something">data</tag>

したがって、要素に属性を設定すると、より明示的にすることができます。

さらに、定義した構造のルールを適用する定義済みスキーマを使用できます。たとえば特定の要素は特定の属性を使用する場合がありますが、他の要素がそれを使用しようとすると、スキーマ検証によりエラーが発生します。

これは大きな力を与えます。しかし、大きな力には大きな責任が伴います。多くの場合、これらのXMLは、それ自体が持つデータよりも構造と関係を表しています。したがって、人間が持っている追加情報がすべてあるため、人間にとって読みにくくなります。したがって、一部の操作では、5行のデータを保存する必要があるため、より多くの膨張を引き起こしますが、スキーマを満たす必要があるため、20行以上のxmlを保持します。

ウィキペディアにはかなり良い要約があります: https://en.wikipedia.org/wiki/XML

一方、JSONはデータを表すことだけを目的としており、それ以上のものはありません。主なタイプのデータを取得します。

  • 整数
  • 文字列
  • ブール
  • 配列
  • 辞書

それでおしまい。あなたは好きな方法でそれらを入れ子にすることができますが、それはあなたの制限です。これらのデータ型のみを使用します。詳細: http://www.json.org/

確かに、属性をディクショナリ内の独自の配列などに移動でき、ほとんど同じことを達成できます。そのため、この比較が頻繁に行われている理由が言及されています。しかし、その中心にあるのは、用途の異なる2つのツールです。ハンマーを手にしたとき、すべてが釘になります。

XMLは、複雑な構造、オブジェクト間の関係、あるファイルを別のファイルでオーバーライドする場合(XPathについて言及した別の回答で処理される場合)に最適です。

JSONは、独自の検証をコードで実行できる小さなオブジェクトと通信する必要がある場合に最適です。また、人間が読める形式で、非常にシンプルです。

5
JackLeo

Jsonは、データとデータのみを含むオブジェクトのテキスト表現であり、それ以外を持っています。 elseを含めたいとしばしば思っていました(ただし、JavaScriptオブジェクトのシリアル化されたテキスト表現であるという完全に有効な設計上の決定ではありません)。

  1. コメント、特にJson構成ファイル。人々はしばしば_commentのようなダミーフィールドに削減されます。
  2. オブジェクトに含まれる可能性のあるすべてのものを説明するスキーマ。患者の予定を表すオブジェクトを返すAPIがあり、そこに含まれる可能性のあるすべてのデータを知っていると考え、伝えられたことのサンプルセットがすべての可能な予定タイプの完全なリストであり、テスト済みであるそれらすべてが、あなたはプライバシーのためにテスト対すべての製品データにアクセスすることはできません。次に、コードを本番環境にデプロイすると、APIが複数のシステムからのデータを集計し、それを開発した人でさえ、患者が持つ可能性のあるすべての予定タイプを知らないことが判明したため、すぐにスプラットします。
  3. データ型、JsonにはString、Number、Boolean、Null、およびArrayのみがあります。日付/時刻文字列を常に解析する必要があり、正確な形式を確認することができないため(上記のポイント2を参照)、これは特に日付でお尻を痛くします。
  4. また、データ型に関連して、異種オブジェクトのリスト、つまり[{// FOOオブジェクト}、{// BARオブジェクト}、{// BARオブジェクト}]のようなリストを取得した場合、解析はa **の面倒になります。
  5. 厳密に型指定された言語で作業する場合、すべてのEdgeケースを手動でカバーするための膨大な作業なしに、Object_A-> A_Serialized == A_Serialized-> Object_Bを保証する方法はありません。

ただし、XMLデータの操作を開始すると、次のようになります。

  1. 大量のXMLシリアル化データを読み取ろうとすると、目がくらむことがあります。
  2. 複雑な名前空間の問題を解決すると、僧侶になりたくなるでしょう。
  3. XSLTとXPATHは紙の上で良さそうで本当にパワフルですが、複雑なクエリ/変換を記述し、特にそれらをデバッグすると、目が血を流しますand僧侶になりたいです。
  4. 結果のデータのXML表現は大幅に大きくなり、BSON、JSONB、CBORなどのバイナリJson実装がバイナリXmlよりもはるかに堅牢で開発されているという事実によってさらに悪化します。あなたは転送のためにzmlデータをgzip圧縮することに縮小されるかもしれません、そしてそれが伴うすべての喜びで。

したがって、そうです、データのどの部分もJSONまたはXMLのいずれかとしてシリアル化できます。十分な労力で回避できないEdgeのケースはありません。それは、対処したい種類の頭痛の種に依存します。 IMHO、JSONを使用すると、コミュニケーション、ドキュメント、プロジェクト管理がうまくいかずに足を踏み入れたほうが簡単ですが、XMLを使用すると、足元で自分を撃ちたくなります。

0
Eugene