27

我最近才听说 JSON(Javascript Object Notation)。谁能解释为什么它被认为(某些网站/博客/等)很重要?我们已经有了 XML,为什么 JSON 更好(除了“原生于 Javascript”)?

编辑:嗯,主要答案主题似乎是“它更小”。但是,它允许跨域获取数据这一事实对我来说似乎很重要。或者这在实践中还没有(还)被广泛使用吗?

4

10 回答 10

19

XML 有几个缺点:

  • 很重!
  • 它提供了与 Javascript 对象模型不完全相同(但非常相似)的内容的分层表示。
  • Javascript 无处不在。无需任何外部解析器,您可以直接使用 JS 解释器处理 JSON。

显然,它并不是要完全取代 XML。对于基于 JS 的 Web 应用程序,它的优点可能很有用。

于 2009-04-29T07:54:20.457 回答
13

JSON 通常比等效的 XML 小得多。较小的传输意味着更快的传输,从而带来更好的用户体验。

于 2009-04-29T07:53:24.767 回答
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 回答
12

JSON 之所以流行,主要是因为它提供了一种方法来规避 Web 浏览器中使用的同源策略,从而允许混搭。

假设您正在域 A 上编写 Web 服务。您无法从域 B 加载 XML 数据并对其进行解析,因为这样做的唯一方法是 XMLHttpRequest,而 XMLHttpRequest 最初受到同源策略的限制,只能进行交谈仅限与包含页面位于同一域的 URL。

事实证明,由于各种原因,您可以跨来源请求 <script> 标签。聪明的人意识到这是解决 XMLHttpRequest 限制的好方法。它可以返回一系列 JavaScript 对象和数组文字,而不是服务器返回 XML。

(作为练习留给读者的额外问题:为什么 <script src="..."> 在没有服务器选择加入的情况下允许跨域但 XHR 不允许?)

当然,返回一个仅由对象字面量组成的 <script> 是没有用的,因为如果不将值分配给某个变量,您将无法对它做任何事情。因此,大多数服务使用 JSON 的变体,称为 JSONP ( http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/ )。

随着混搭的普及,人们意识到 JSON 通常是一种方便的数据交换格式,尤其是当 JavaScript 是通道的一端时。例如,JSON 在 Chromium 中被广泛使用,即使在 C++ 双方都使用的情况下也是如此。这只是表示简单数据的一种很好的轻量级方式,在许多语言中都存在良好的解析器。

有趣的是,使用 <script> 标签来做 mashup 是非常不安全的,因为它本质上是故意的 XSS。因此必须引入原生 JSON ( http://ejohn.org/blog/native-json-support-is-required/ ),这消除了格式的原始优势。但到那个时候,它已经超级流行了:)

于 2009-04-29T08:07:06.497 回答
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 获取第二个标记对象,则需要使用功能强大但冗长的 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 的数据相比,您的脑力开销要少得多。

上述所有示例都忽略了一个或多个节点可用、重复的可能性,或者该节点只有一个或没有子节点的可能性。但是,为了说明 JSON 的原生性,要使用 jsonObj 执行此操作,您只需:

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

(有些人可能不喜欢这么长的三元,但它有效)。但是 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

这些网页可能会有所帮助:

  1. JSON - xml 的无脂肪替代品
  2. 为什么 JSON 对您很重要!
于 2009-04-29T07:54:08.320 回答
2

这取决于你要做什么。这里有很多答案更喜欢 JSON 而不是 XML。仔细看的话,差别不大。

如果你有一棵对象树,你只会得到 javascript 对象树。如果您看一下使用 OOP 样式访问的压力,而不是回头看您。假设您有一个在树中构造的 A、B、C 类型的对象。您可以轻松地将它们序列化为 JSON。如果你把它们读回来,你只会得到一个 javascript 对象树。要重建您的 A、B、C,您必须手动将值填充到手动创建的对象中,或者进行一些黑客操作。听起来像是解析 XML 和创建对象?嗯,是 :)

如今,只有最新的浏览器带有对 JSON 的原生支持。要支持更多浏览器,您有两种选择:a)您在 javascript 中加载一个 json 解析器来帮助您解析。那么,这听起来有多胖?我经常看到的另一个选项是 eval。您可以对 JSON 字符串执行 eval() 来获取对象。但这引入了一系列全新的安全问题。指定了 JSON,因此它不能包含函数。如果您不检查对象的功能,有人可以轻松地向您发送正在执行的代码。

所以它可能取决于你更喜欢什么:JSON 或 XML。最大的区别可能是访问事物的方式,无论是脚本标签 XMLHTTPRequest ......我会决定使用什么。在我看来,如果浏览器中对 XPATH 有适当的支持,我通常会决定使用 XML。但时尚是针对 json 并在 javascript 中加载额外的 json 解析器。

如果你不能决定并且你知道你需要一些真正强大的东西,你就必须看看 YAML。阅读有关 YAML 的内容非常有趣,可以更深入地了解该主题。但这实际上取决于您要做什么。

于 2009-04-29T13:06:36.743 回答
1

JSON 是一种基于文本的对象序列化格式,它比 XML 更轻量级,并且直接与 JavaScript 的对象模型集成。这就是它的大部分优势。

它的缺点(与 XML 相比)大致是:可用工具较少(忘记标准验证和/或转换,更不用说大多数编辑器中的语法突出显示或格式良好检查),不太可能是人类可读的(有巨大的JSON 和 XML 的可读性不同,因此这必然是一个模糊的陈述),与 JavaScript 的紧密集成导致与其他环境的集成不太紧密。

于 2009-04-29T17:50:49.010 回答
1

JSON是一种在 Javascript 对象中序列化数据的方法。语法取自语言,因此处理 Javascript 的开发人员应该熟悉它,并且 - 作为对象的字符串化 - 它是一种在浏览器内进行交互的更自然的序列化方法,而不是成熟的 XML 衍生产品(包含所有暗示的任意设计决策)。

它轻巧直观。

于 2009-04-29T07:57:48.343 回答
0

并不是说它更好,而是它可以将许多东西捆绑在一起,从而无需手动解析即可实现无缝数据传输!

例如 javascript -> C# Web 服务 -> javascript

于 2009-04-29T07:52:31.460 回答