JSONとXMLの違いは何ですか?
基本的な違いは、他の回答では言及されていないようですが、XMLはマークアップ言語であるということです(実際にその名前で言われているように)。
マークアップ言語は、自由に流れるプレーンテキストに追加情報を追加する方法です。
Here is some text.
XML(特定の要素の語彙を使用)を使用すると、次のことができます。
<Document>
<Paragraph Align="Center">
Here <Bold>is</Bold> some text.
</Paragraph>
</Document>
これにより、マークアップ言語がドキュメントの表現に非常に役立ちます。
JSONのようなオブジェクト表記はそれほど柔軟ではありません。しかし、これは通常良いことです。オブジェクトを表現する場合、余分な柔軟性は必要ありません。上記の例をJSONで表すには、実際にはXMLが解決するいくつかの問題を手動で解決する必要があります。
{
"Paragraphs": [
{
"align": "center",
"content": [
"Here ", {
"style" : "bold",
"content": [ "is" ]
},
" some text."
]
}
]
}
XMLほど良いものではありません。その理由は、オブジェクト表記を使用してマークアップを行おうとしているからです。したがって、文字列とネストされたオブジェクトの混合を保持できる「コンテンツ」配列を使用して、オブジェクトの周りにプレーンテキストのスニペットを分散させる方法を考案する必要があります。
一方、典型的なオブジェクトの階層があり、それらをストリームで表現したい場合、JSONはHTMLよりもこのタスクに適しています。
{
"firstName": "Homer",
"lastName": "Simpson",
"relatives": [ "Grandpa", "Marge", "The Boy", "Lisa", "I think that's all of them" ]
}
論理的に同等のXMLは次のとおりです。
<Person>
<FirstName>Homer</FirstName>
<LastName>Simpsons</LastName>
<Relatives>
<Relative>Grandpa</Relative>
<Relative>Marge</Relative>
<Relative>The Boy</Relative>
<Relative>Lisa</Relative>
<Relative>I think that's all of them</Relative>
</Relatives>
</Person>
JSONは、プログラミング言語で宣言したデータ構造に似ています。また、名前の冗長な繰り返しが少なくなります。
しかし、何よりも重要なことは、「レコード」(順序付けられていないアイテム、名前で識別される)と「リスト」(順序付けられたアイテム、位置で識別される)を区別する明確な方法があります。オブジェクトの表記法は、このような区別がなければ実質的に役に立ちません。そして、XMLにはそのような区別はありません!私のXMLの例では、<Person>
はレコードであり、<Relatives>
はリストですが、構文ではそのように識別されません。
代わりに、XMLには「要素」と「属性」があります。これは同じ種類の区別のように見えますが、属性は文字列値しか持つことができないため、そうではありません。ネストされたオブジェクトにすることはできません。したがって、<Person>
を単一の文字列に変換する必要がないため、このアイデアを<Relatives>
に適用することはできませんでした。
外部スキーマ、または追加のユーザー定義属性を使用して、XMLのリストとレコードの区別を形式化できます。 JSONの利点は、低レベルの構文にその区別が組み込まれているため、非常に簡潔で普遍的なことです。これは、JSONがデフォルトでより「自己記述的」であることを意味し、これは両方の形式の重要な目標です。
したがって、JSONは、XMLのスイートスポットがドキュメントマークアップであるオブジェクト表記法の最初の選択肢になるはずです。
XMLにとって残念なことに、私たちはすでに世界一のリッチテキストマークアップ言語としてHTMLを使用しています。 HTMLをXMLの観点から再定式化しようとしましたが、これにはあまり利点がありません。
したがって、XMLは(私の意見では)かなり限られたニッチテクノロジーであり、何らかの理由でHTMLを使用したくない場合に、独自のリッチテキストマークアップ言語を発明するのに最適です。問題は、1998年にはWebについてまだ多くの誇大広告があり、XMLがHTMLに表面的に類似しているために人気が高まったことでした。便利なマークアップ用に実際に設計された構文を階層データに適用しようとするのは、奇妙な設計選択でした。
どちらも階層データのデータ形式であるため、構文はまったく異なりますが、構造は似ています。例:
JSON:
{
"persons": [
{
"name": "Ford Prefect",
"gender": "male"
},
{
"name": "Arthur Dent",
"gender": "male"
},
{
"name": "Tricia McMillan",
"gender": "female"
}
]
}
XML:
<persons>
<person>
<name>Ford Prefect</name>
<gender>male</gender>
</person>
<person>
<name>Arthur Dent</name>
<gender>male</gender>
</person>
<person>
<name>Tricia McMillan</name>
<gender>female</gender>
</person>
</persons>
ただし、XML形式は、例で示したものよりも高度です。たとえば、各要素に属性を追加したり、名前空間を使用して要素を分割したりできます。 XMLファイルの形式、XMLデータを照会するためのXPATH言語、およびXMLをプレゼンテーションデータに変換するためのXSLTを定義するための標準もあります。
XML形式はしばらく前から存在しているため、多くのソフトウェアが開発されています。 JSON形式は非常に新しいため、サポートはほとんどありません。
XMLは独立したデータ形式として開発されましたが、JSONはJavascriptおよびAJAXで使用するために特別に開発されたため、形式はJavascriptリテラルオブジェクトとまったく同じです(つまり、Javascriptコードのサブセットです。 '値を決定する式が含まれていません)。
XMLとJSONの違いは、XMLはメタ言語/マークアップ言語であり、JSONは軽量のデータ交換であるということです。つまり、XML構文は、固有のセマンティクスを持たないように特別に設計されています。特定の要素名は、特定の処理アプリケーションが特定の方法でそれらを処理するまで、何も意味しません。対照的に、JSON構文には、{}の間のものはオブジェクト、[]の間のものは配列など、特定のセマンティクスが組み込まれています。
したがって、JSONパーサーは、すべてのJSONドキュメントの意味を正確に把握しています。 XMLパーサーは、データからマークアップを分離する方法のみを知っています。 XMLドキュメントの意味に対処するには、追加のコードを記述する必要があります。
ポイントを説明するために、Guffaの例を借ります。
{ "persons": [
{
"name": "Ford Prefect",
"gender": "male"
},
{
"name": "Arthur Dent",
"gender": "male"
},
{
"name": "Tricia McMillan",
"gender": "female"
} ] }
彼が提供するXMLの同等物は実際には同じものではありません。JSONの例は意味的に完全ですが、同じ効果を得るにはXMLを特定の方法で解釈する必要があるからです。実際、JSONはセマンティクスが既知の確立されたマークアップ言語を使用する例ですが、XMLサンプルは定義済みのセマンティクスなしでまったく新しいマークアップ言語を作成します。
より優れたXML同等物は、JSONと同じセマンティクスで(架空の)XJSON言語を定義することですが、XML構文を使用します。次のようになります。
<xjson>
<object>
<name>persons</name>
<value>
<array>
<object>
<value>Ford Prefect</value>
<gender>male</gender>
</object>
<object>
<value>Arthur Dent</value>
<gender>male</gender>
</object>
<object>
<value>Tricia McMillan</value>
<gender>female</gender>
</object>
</array>
</value>
</object>
</xjson>
XJSONプロセッサーを作成すると、JSONが表現できるすべてのタイプのデータに対して、JSONプロセッサーが行うことを正確に実行でき、JSONとXJSONの間でデータをロスレスに変換できます。
したがって、XMLがJSONと同じセマンティクスを持たないと文句を言うのは、見落としがちです。 XML構文は、設計上セマンティクスがありません。ポイントは、必要なセマンティクスでマークアップ言語を作成するために使用できる基礎となる構文を提供することです。これにより、XMLはアドホックデータおよびドキュメント形式の作成に最適です。パーサーを作成する必要はなく、プロセッサを作成するだけでよいためです。
しかし、XMLの欠点は、構文が冗長になることです。作成するマークアップ言語については、特定の言語の特定のセマンティクスを表現する、より簡潔な構文を作成できます。したがって、JSON構文は、上の仮想XJSONよりもはるかにコンパクトです。
実際に広く使用されているデータ形式の場合、独自の構文を作成してその構文のパーサーを記述するために必要な余分な時間は、カスタムマークアップ言語の簡潔さと直感的な構文によって相殺されます。また、セマンティクスを実装する必要がある多くのXMLマークアップ言語を作成するよりも、確立されたセマンティクスでJSONを使用する方が理にかなっている場合が多いということです。
また、特定の種類の言語とプロトコルをXMLでプロトタイプ化することは理にかなっていますが、言語またはプロトコルが一般的に使用されるようになったら、よりコンパクトで表現力豊かなカスタム構文の作成を検討します。
サイドノートとして、SGMLがこれを認識し、SGMLドキュメントのマークアップの削減を指定するメカニズムを提供したことは興味深いことです。したがって、実際に、JSON構文用のSGML DTDを記述して、JSONドキュメントをSGMLパーサーで読み取れるようにすることができます。 XMLはこの機能を削除しました。つまり、今日、特定のマークアップ言語に対してよりコンパクトな構文が必要な場合、JSONのようにXMLを残す必要があります。
これらはデータを表す2つの異なる方法ですが、かなり似ていません。 [〜#〜] json [〜#〜] および [〜#〜] xml [〜#〜] のウィキペディアのページには、それぞれの例が示されています。 比較 パラグラフ
これらは、情報を表現する2つの形式です。 JSONはよりコンパクトになるように設計されましたが、XMLはより読みやすいように設計されました。
XMLは<tag>item</tag>
のようなアイテムの表示にタグ構造を使用するため、XMLドキュメントは互いにネストされたタグのセットです。また、JSON構文は、リストや辞書などのすべてのものを備えた、Javascript言語からの構築のように見えます。
{
'attrib' : 'value',
'array' : [1, 2, 3]
}
したがって、JSONを使用する場合、多くのスクリプト言語、特にJavascriptとPythonでJSON文字列を使用するのは非常に簡単です。