我最近才听说JSON(JavaScript对象表示法)。 有人可以解释一下为什么它被认为很重要吗?除了它是“JavaScript原生”的之外,我们已经有XML了,为什么JSON更好呢?
编辑:嗯,主要答案的主题似乎是“它更小”。然而,它允许跨域数据获取的事实对我来说似乎很重要。或者在实践中还没有(或不太)被广泛使用吗?
我最近才听说JSON(JavaScript对象表示法)。 有人可以解释一下为什么它被认为很重要吗?除了它是“JavaScript原生”的之外,我们已经有XML了,为什么JSON更好呢?
编辑:嗯,主要答案的主题似乎是“它更小”。然而,它允许跨域数据获取的事实对我来说似乎很重要。或者在实践中还没有(或不太)被广泛使用吗?
XML有几个缺点:
显然,它并不意味着要完全取代XML。对于基于JS的Web应用程序,它的优势可能很有用。
eval()
也不建议使用,因为它可能导致 XSS 攻击。 - Richard SzalayJSON通常比其XML等效格式更小。较小的传输意味着更快的传输,从而导致更好的用户体验。
<person name='John Doe' tags='friend male'/>
是紧凑的XML格式,只有44个字符。相比之下,紧凑的JSON格式是:{person:{"name":"John Doe","tag":["friend","male"]}}
,共52个字符。这两者之间有25%的差距,XML更优。XML可能会更大,但不一定如此。 - Cheeso{"name":"John Doe","tag":["friend","male"]}
。这使得它有45个字符,比XML仅多1个字符。 - Richard SzalayJSON作为一种数据交换格式开始广泛使用,主要是因为它提供了一种规避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在通道的一端时。例如,在Chromium中广泛使用JSON,即使在两端都使用C ++的情况下也是如此。这只是表示简单数据的一种不错的轻量级方式,并且许多语言都有良好的解析器可用。
有趣的是,使用<script>标签进行混搭非常不安全,因为本质上是故意进行XSS攻击。因此必须引入原生JSON (http://ejohn.org/blog/native-json-support-is-required/),这消除了该格式的最初好处。但是那时它已经非常流行了 :)
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">
)之间存在紧张关系。
<person name='John Doe' tags='friend male'/>
是紧凑的XML格式,只有44个字符。相比之下,紧凑的JSON格式是:{person:{"name":"John Doe","tag":["friend","male"]}}
,共52个字符。这两者之间有25%的差距,XML更优。XML可能会更大,但不一定如此。 - Cheeso如果您正在使用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];
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);
以下网页可能会有所帮助:
JSON 是一种在 Javascript 对象中序列化数据的方式。其语法取自该语言,因此对于处理 Javascript 的开发人员来说应该很熟悉,并且作为对象的字符串化,它是浏览器内交互的更自然的序列化方法,比全面的 XML 派生(带有所有任意设计决策)更加轻量和直观。
它轻巧而直观。
JSON是一种基于文本的对象序列化格式,比XML更轻量级,并直接与JavaScript的对象模型集成。这就是它的大部分优点。
与XML相比,它的缺点大致有:可用工具较少(忘记标准验证和/或转换,更不用说在大多数编辑器中进行语法高亮或格式检查),不太可能人类可读(JSON和XML的可读性存在巨大差异,因此这是一个必然模糊的陈述),与JavaScript的紧密集成导致与其他环境的集成不够紧密。
不是因为它更好,而是因为它可以将许多东西联系在一起,允许无需手动解析的无缝数据传输!
例如 javascript -> C# Web 服务 -> javascript