27

JSON (Javascript Object Notation) について聞いたのはつい最近のことです。なぜそれが(一部のウェブサイト/ブログ/などで)重要であると考えられているのか説明できますか? XML は既にありますが、なぜ JSON の方が優れているのでしょうか (「Javascript ネイティブ」であること以外に)。

編集:うーん、主な回答テーマは「小さい」ようです。ただし、ドメイン間でデータをフェッチできるという事実は、私にとって重要なようです。それとも、これは実際には(まだ)あまり使用されていませんか?

4

10 に答える 10

19

XML にはいくつかの欠点があります。

  • 重い!
  • これは、Javascript オブジェクト モデルとまったく同じではありません (ただし、かなり似ています) コンテンツの階層表現を提供します。
  • Javascriptはどこでも利用できます。外部パーサーがなくても、JSON を JS インタープリターで直接処理できます。

XML を完全に置き換えることを意図していないことは明らかです。JS ベースの Web アプリの場合、その利点が役立ちます。

于 2009-04-29T07:54:20.457 に答える
13

JSON は一般に、XML に相当するものよりもはるかに小さいです。転送が小さいほど転送が高速になり、ユーザー エクスペリエンスが向上します。

于 2009-04-29T07:53:24.767 に答える
12

JSON が一般的に使用されるようになった主な理由は、Web ブラウザーで使用される同一生成元ポリシーを回避してマッシュアップを可能にする方法を提供するためです。

ドメイン A で Web サービスを作成しているとします。ドメイン B から XML データを読み込んで解析することはできません。それを行う唯一の方法は XMLHttpRequest であり、XMLHttpRequest は元々、同一オリジン ポリシーによって通信に制限されていたからです。含まれているページと同じドメインの URL のみ。

さまざまな理由から、オリジン全体で <script> タグをリクエストできることがわかりました。賢明な人々は、これが XMLHttpRequest の制限を回避する良い方法であることに気付きました。サーバーは XML を返す代わりに、一連の JavaScript オブジェクトと配列リテラルを返すことができます。

(ボーナスの質問は、読者への演習として残しました: <script src="..."> はサーバーのオプトインなしでドメイン間で許可されているのに、XHR は許可されていないのはなぜですか?)

もちろん、オブジェクト リテラルのみで構成される <script> を返すことは役に立ちません。変数に値を代入しないと何もできないからです。したがって、ほとんどのサービスは、JSONP ( http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/ )と呼ばれる JSON のバリアントを使用します。

マッシュアップの人気が高まるにつれ、JSON は一般的に便利なデータ交換形式であることがわかりました。特に JavaScript がチャネルの一端である場合はなおさらです。たとえば、C++ が両側にある場合でも、JSON は Chromium で広く使用されています。単純なデータを表現するための軽量な方法であり、多くの言語で優れたパーサーが存在します。

面白いことに、 <script> タグを使用してマッシュアップを行うことは、本質的に意図的に XSS を行っているため、非常に安全ではありません。そのため、ネイティブ JSON ( http://ejohn.org/blog/native-json-support-is-required/ ) を導入する必要がありましたが、これにより、この形式の本来の利点が失われました。しかし、その頃にはすでに超人気でした:)

于 2009-04-29T08:07:06.497 に答える
12

JSON ははるかに簡潔です。XML:

<person>
    <name>John Doe</name>
    <tags>
        <tag>friend</tag>
        <tag>male</tag>
   </tags>
</person>

JSON:

{"name": "John Doe", "tags": ["friend", "male"]}

重複する機能も少なくなります。たとえば、XML では、要素 (上記) と属性 ( <person name="John Doe">) の使用の選択の間に緊張関係があります。

于 2009-04-29T07:56:31.450 に答える
6

Javascript で作業している場合は、JSON の方がはるかに簡単です。これは、JSON を Javascript オブジェクトに直接評価できるためです。これは、DOM よりもはるかに簡単に操作できます。

上記の XML と JSON を借用して少し変更する

XML:

<person>
    <name>John Doe</name>
    <tag>friend</tag>
    <tag>male</tag>
</person>

JSON:

{ person: {"name": "John Doe", "tag": ["friend", "male"]} }

XML を使用して 2 番目のタグ オブジェクトを取得する場合は、強力ですが詳細な DOM API を使用する必要があります。

var tag2=xmlObj.getElementsByTagName("person")[0].getElementsByTagName("tag")[1];

一方、JSON 経由で入ってきた Javascript オブジェクトでは、次のように単純に使用できます。

var tag2=jsonObj.person.tag[1];

もちろん、Jquery を使用すると DOM の例がはるかに単純になります。

var tag2=$("person tag",xmlObj).get(1);

ただし、JSON は Javascript の世界に「適合」します。しばらくそれを使用すると、XML ベースのデータを使用するよりも精神的なオーバーヘッドがはるかに少ないことがわかります。

上記の例はすべて、1 つ以上のノードが使用可能であるか、重複している可能性、またはノードに子が 1 つしかないかまったくない可能性を無視しています。ただし、JSON のネイティブ性を示すために、jsonObj でこれを行うには、次のようにする必要があります。

var tag2=(jsonObj.person && jsonObj.person.tags && jsonObj.person.tags.sort && jsonObj.person.tags.length==2 ? jsonObj.person.tags[1] : null);

(一部の人々は、それほど長い 3 進数を好まないかもしれませんが、機能します)。しかし、XMLは(私の意見では)より厄介です(実装によっては、作業をやり直す必要がある可能性のあるdomメソッドを呼び出し続けるため、三項アプローチに行きたくないでしょう):

var tag2=null;
var persons=xmlObj.getElementsByTagName("person");
if(persons.length==1) {
    var tags=persons[0].getElementsByTagName("tag");
    if(tags.length==2) { tag2=tags[1]; }
}

Jquery (未テスト):

var tag2=$("person:only-child tag:nth-child(1)",xmlObj).get(0);
于 2009-04-30T00:10:27.880 に答える
3

これらの Web ページが役立つ場合があります。

  1. JSON - xml に代わる Fat Free の代替
  2. JSON が重要な理由
于 2009-04-29T07:54:08.320 に答える
2

それはあなたが何をしようとしているかによって異なります。ここには、XML よりも JSON を好む回答がたくさんあります。深く見てみると、大きな違いはありません。

オブジェクトのツリーがある場合、javascript オブジェクトのツリーのみが返されます。あなたがOOPスタイルのアクセスを使用することへの緊張を見てみると、あなたに背を向けるよりも. ツリーで構築されたタイプ A、B、C のオブジェクトがあるとします。それらを簡単に JSON にシリアル化できます。それらを読み返すと、javascript オブジェクトのツリーのみが得られます。A、B、C を再構築するには、値を手動で作成したオブジェクトに手動で詰め込むか、いくつかのハックを行う必要があります。XML を解析してオブジェクトを作成するように聞こえますか? はい、そうです :)

現在、JSON をネイティブでサポートしているのは最新のブラウザーだけです。より多くのブラウザーをサポートするには、次の 2 つのオプションがあります。a) 解析に役立つ JSON パラサーを JavaScript でロードします。それで、これは運命に関してどれくらい太っているように聞こえますか?私がよく目にするもう 1 つのオプションは eval です。オブジェクトを取得するには、JSON 文字列に対して eval() を実行するだけです。しかし、これはまったく新しい一連のセキュリティ問題をもたらします。JSON が指定されているため、関数を含めることはできません。関数のオブジェクトをチェックしていない場合、誰かが実行中のコードを簡単に送信できます。

そのため、JSON か XML のどちらを好むかによって異なる場合があります。最大の違いはおそらく、スクリプト タグ XMLHTTPRequest など、アクセスの方法です。これを使用するかどうかを決定します。私の意見では、ブラウザーで XPATH が適切にサポートされている場合、XML を使用することに決めることがよくあります。しかし、ファッションはjsonに向けられており、javascriptで追加のjsonパーサーをロードしています。

決定できず、本当に強力なものが必要であることがわかっている場合は、YAML を検討する必要があります。YAML について読むことは、このトピックに関する洞察を深めるために非常に興味深いものです。しかし、それはあなたが何をしようとしているのかに大きく依存します。

于 2009-04-29T13:06:36.743 に答える
1

JSONは、Javascript オブジェクトでデータをシリアル化する方法です。構文は言語から取られているため、Javascript を扱う開発者にはなじみのあるものであり、オブジェクトの文字列化であるため、完全な XML 派生物よりもブラウザ内で対話するためのより自然なシリアル化方法です。 (意味するすべての恣意的な設計決定を伴う)。

軽くて直感的です。

于 2009-04-29T07:57:48.343 に答える
1

JSON は、XML よりも軽量で、JavaScript のオブジェクト モデルと直接統合される、テキスト ベースのオブジェクト シリアル化形式です。それがその利点のほとんどです。

その欠点 (XML と比較して) は、大まかに次のとおりです。使用可能なツールが少ない (ほとんどのエディターでの構文の強調表示や整形式チェックは言うまでもなく、標準の検証や変換を忘れる)、人間が判読できる可能性が低い (膨大なJSON と XML の両方の可読性にはさまざまな違いがあるため、必然的にあいまいなステートメントになります)、JavaScript との緊密な統合により、他の環境との統合がそれほど緊密ではなくなります。

于 2009-04-29T17:50:49.010 に答える
0

優れているというわけではありませんが、手動で解析することなくシームレスなデータ転送を可能にするために、多くのものを結び付けることができます!

たとえば、javascript -> C# Web サービス -> javascript

于 2009-04-29T07:52:31.460 に答える