Rab*_*ski 26 javascript xml json dataformat
我最近才听说过JSON(Javascript Object Notation).任何人都可以解释为什么(某些网站/博客/等)被认为是重要的?我们已经有了XML,为什么JSON更好(除了'原生于Javascript')?
编辑:嗯,主要答案主题似乎是'它更小'.但是,它允许跨域提取数据这一事实对我来说似乎很重要.或者这在实践中是否(尚未)使用得多?
Meh*_*ari 20
XML有几个缺点:
显然,它并不意味着完全取代XML.对于基于JS的Web应用程序,其优势可能很有用.
Ric*_*lay 13
JSON通常比其XML等价物小得多.较小的传输意味着更快的传输,从而带来更好的用户体验.
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">)之间存在紧张关系.
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/),这样可以避免格式的原始优势.但到那个时候,它已经超人气了:)
如果您使用的是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)
| 归档时间: |
|
| 查看次数: |
4507 次 |
| 最近记录: |