为什么JSON很重要?

时间:2009-04-29 07:50:06

标签: javascript xml json dataformat

我最近才听说过JSON(Javascript Object Notation)。 任何人都可以解释为什么(某些网站/博客/等)被认为是重要的? 我们已经有了XML,为什么JSON更好(除了'原生于Javascript')?

编辑:嗯,主答案主题似乎是'它更小'。但是,它允许跨域提取数据这一事实对我来说似乎很重要。或者这在实践中是否(还)使用得很多?

10 个答案:

答案 0 :(得分:19)

XML有几个缺点:

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

显然,这并不意味着完全取代XML。对于基于JS的Web应用程序,其优势可能很有用。

答案 1 :(得分:13)

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

答案 2 :(得分: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">)之间存在紧张关系。

答案 3 :(得分:11)

JSON开始流行使用主要是因为它提供了一种绕过Web浏览器中使用的同源策略的方法,从而允许mashup。

假设您正在域A上编写Web服务。您无法从域B加载XML数据并解析它,因为唯一的方法是XMLHttpRequest,而XMLHttpRequest最初受同源限制与仅与包含页面在同一域中的URL进行通信的策略。

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

(作为练习留给读者的奖励问题:为什么在没有服务器选择加入的域中允许&lt; script src =“...”&gt;但是XHR不是?)

当然,返回&lt; script&gt;它只包含对象文字是没用的,因为如果不将值赋给某个​​变量,就不能对它做任何事情。因此,大多数服务使用JSON的变体,称为JSONP(http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/)。

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

有趣的是,使用&lt; script&gt;标记做混搭是非常不安全的,因为它本质上是XSS自己的目的。因此必须引入原生JSON(http://ejohn.org/blog/native-json-support-is-required/),这样可以避免格式的原始优势。但到那时,它已经非常受欢迎了:)

答案 4 :(得分:5)

如果您使用的是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 apis:

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);

答案 5 :(得分:4)

答案 6 :(得分:2)

这取决于你要做什么。这里有很多答案,更喜欢JSON而不是XML。如果你仔细看一下就没有太大的区别了。

如果你有一个对象树,你只能获得一个javascript对象树。如果你看一下使用OOP风格访问的紧张情绪,而不是回头看你。假设您有一个在树中构造的类型为A,B,C的对象。您可以轻松地将它们序列化为JSON。如果你再读回来,你只会获得一个javascript对象树。要重建你的A,B,C,你必须手动将值填充到手动创建的对象中,或者你做一些黑客攻击。听起来像解析XML和创建对象?嗯,是的:)

现在只有最新的浏览器才能获得JSON的原生支持。要支持更多浏览器,您有两种选择:a)在javascript中加载json paraser以帮助您解析。那么,这有关于肥胖的声音有多胖?我经常看到的另一个选项是eval。您可以在JSON String上执行eval()来获取对象。但这引入了一整套新的安全问题。指定了JSON,因此它不能包含函数。如果您没有检查对象的功能,则可以轻松地向您发送正在执行的代码。

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

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

答案 7 :(得分:1)

JSON是一种在Javascript对象中序列化数据的方法。语法取自语言,因此对于处理Javascript的开发人员来说应该很熟悉,并且 - 作为对象的字符串化 - 它是一种比完全成熟的XML派生的浏览器内部交互更自然的序列化方法(所有暗示的任意设计决定)。

它轻巧而直观。

答案 8 :(得分:1)

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

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

答案 9 :(得分:0)

它不是更好,但它可以将许多东西联系在一起,无需手动解析即可实现无缝数据传输!

例如javascript - &gt; C#网络服务 - &gt;的JavaScript