为什么JSON很重要?

Rab*_*ski 26 javascript xml json dataformat

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

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

Meh*_*ari 20

XML有几个缺点:

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

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

  • @Cheeso - `eval()`也被推荐反对,因为它可能导致XSS攻击. (2认同)

Ric*_*lay 13

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

  • 我同意,因此我使用"一般"一词.一旦有了复杂项的数组,XML就会变得比JSON更大.当然,你对"一般"这个词的误读是不值得的. (4认同)

jma*_*mah 12

JSON更简洁.XML:

<person>
    <name>John Doe</name>
    <tags>
        <tag>friend</tag>
        <tag>male</tag>
   </tags>
</person>
Run Code Online (Sandbox Code Playgroud)

JSON:

{"name": "John Doe", "tags": ["friend", "male"]}
Run Code Online (Sandbox Code Playgroud)

重叠功能也较少.例如,在XML中,选择使用元素(如上所述)与属性(<person name="John Doe">)之间存在紧张关系.

  • @Steve,因为什么时候可读性对数据交换格式很重要? (4认同)
  • 我认为可读性非常重要,但您可以使用标记和换行符来格式化JSON以匹配xml. (2认同)

Aar*_*man 12

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

假设您正在域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/).

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

有趣的是,使用<script>标签进行mashup是非常不安全的,因为它本质上是XSS自己的目的.因此必须引入原生JSON(http://ejohn.org/blog/native-json-support-is-required/),这样可以避免格式的原始优势.但到那个时候,它已经超人气了:)


jwl*_*jwl 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"]} }
Run Code Online (Sandbox Code Playgroud)

如果你想用XML获取第二个标记对象,你需要使用强大但冗长的DOM apis:

var tag2=xmlObj.getElementsByTagName("person")[0].getElementsByTagName("tag")[1];
Run Code Online (Sandbox Code Playgroud)

使用通过JSON引入的Javascript对象,您可以简单地使用:

var tag2=jsonObj.person.tag[1];
Run Code Online (Sandbox Code Playgroud)

当然,Jquery使DOM示例更简单:

var tag2=$("person tag",xmlObj).get(1);
Run Code Online (Sandbox Code Playgroud)

但是,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);
Run Code Online (Sandbox Code Playgroud)

(有些人可能不喜欢那么长的三元,但它确实有效).但是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]; }
}
Run Code Online (Sandbox Code Playgroud)

Jquery(未经测试):

var tag2=$("person:only-child tag:nth-child(1)",xmlObj).get(0);
Run Code Online (Sandbox Code Playgroud)


ste*_*ell 0

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

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