JSON和XML比较

Dur*_*utt 268 xml json

我想知道哪个更快:XML和JSON?什么时候使用哪一个?

Fel*_*ing 241

更快不是JSON或XML的属性,或者是这些属性之间的比较会产生的结果.如果有,则它是解析器的属性或传输数据的带宽.

以下是(开头)JSON和XML的优缺点列表:


JSON

优点:

  • 简单的语法,与XML相比,可以减少"标记"开销.
  • 易于使用JavaScript,因为标记是JS对象文字表示法的子集,并且具有与JavaScript相同的基本数据类型.
  • 用于描述和数据类型以及结构验证的JSON模式
  • JsonPath用于在深层嵌套结构中提取信息

缺点:

  • 语法简单,只支持少数几种不同的数据类型.

  • 不支持评论.


XML

优点:

  • 广义标记; 可以为任何目的创建"方言"
  • XML Schema用于数据类型,结构验证.使它也可以创建新的数据类型
  • XSLT用于转换为不同的输出格式
  • XPath/XQuery用于在深层嵌套结构中提取信息
  • 内置对命名空间的支持

缺点:

  • 与JSON相比相对冗长(导致相同数量信息的数据更多).

所以最后你必须决定你需要什么.显然,这两种格式都有其合法用例.如果您主要使用JavaScript,那么您应该使用JSON.

请随意添加利弊.我不是XML专家;)

  • @DmitryLobanov:他们只是为JSON标准添加了一些额外的限制,但是其他JSON工具无法识别它.所以它不是JSON的"原生".但是对于XML,限制是在标准中编写的,因此它是原生的. (21认同)
  • JSON和Pro for XML的另一个Con:JSON不支持对象引用(循环或非循环),XML也支持.XML通过强制`id`属性在文档中是唯一的来实现这一点. (19认同)
  • @EarthEngine实际上Json.Net(http://json.codeplex.com/)确实支持对象引用:http://james.newtonking.com/projects/json/help/index.html?topic=html/PreserveObjectReferences.htm . (6认同)
  • JSON内置了数组,以及"null"值.而在XML中,您需要在架构解析器中使用某种约定.JSON还有类似XSLT的转换项目(例如https://github.com/emlynoregan/bOTLjs) (5认同)
  • json 的另一个缺点是,为了完整性,它不支持注释 (2认同)

jel*_*ord 218

在回答何时使用哪一个,有一点背景之前:

编辑:我应该提一下,这种比较实际上是从在JavaScript浏览器中使用它们的角度来看.这也不数据格式的方法被使用,并且有很多很好的解析器,这将改变细节,使我在说什么不是很有效的.

JSON更紧凑,并且(在我看来)更具可读性 - 在传输中它可以"更快",因为传输的数据更少.

在解析中,它取决于您的解析器.将代码(无论是JSON还是XML)转换为数据结构(如地图)的解析器可以受益于XML的严格性(XML Schema很好地消除数据结构的歧义) - 但是在JSON中项目的类型(String /数字/嵌套JSON对象)可以在语法上推断,例如:

myJSON = {"age" : 12,
          "name" : "Danielle"}
Run Code Online (Sandbox Code Playgroud)

解析器不需要足够智能来实现12代表数字(和Danielle任何其他字符串一样).所以在javascript中我们可以这样做:

anObject = JSON.parse(myJSON);
anObject.age === 12 // True
anObject.name == "Danielle" // True
anObject.age === "12" // False
Run Code Online (Sandbox Code Playgroud)

在XML中,我们必须执行以下操作:

<person>
    <age>12</age>
    <name>Danielle</name>
</person>
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,这说明了XML更加冗长;数据传输的一个问题).要使用这些数据,我们将通过解析器运行它,然后我们必须调用类似的东西:

myObject = parseThatXMLPlease();
thePeople = myObject.getChildren("person");
thePerson = thePeople[0];
thePerson.getChildren("name")[0].value() == "Danielle" // True
thePerson.getChildren("age")[0].value() == "12" // True
Run Code Online (Sandbox Code Playgroud)

实际上,一个好的解析器可能会age为你打字(另一方面,你可能不希望它).当我们访问这些数据时发生了什么 - 而不是像上面的JSON示例那样进行属性查找 - 我们正在对密钥进行地图查找name.像这样形成XML可能更直观:

<person name="Danielle" age="12" />
Run Code Online (Sandbox Code Playgroud)

但我们仍然需要进行地图查找才能访问我们的数据:

myObject = parseThatXMLPlease();
age = myObject.getChildren("person")[0].getAttr("age");
Run Code Online (Sandbox Code Playgroud)

编辑:原文:

在大多数编程语言中(并非所有编程语言),像这样的地图查找将比属性查找更昂贵(就像我们在解析JSON时得到的那样).

这是误导性的:请记住,在JavaScript(和其他动态语言)中,地图查找和字段查找之间没有区别.事实上,现场查找只是一个地图查找.

如果您想进行真正有价值的比较,最好是对其进行基准测试 - 在您计划使用数据的上下文中执行基准测试.

正如我一直打字的那样,Felix Kling已经提出了一个相当简洁的答案,比较它们何时使用每一个,所以我不再继续下去了.

  • 事实并非如此,例如,在PHP中,JSON使用的json.so在78k时没有依赖,另一方面,XML需要54k/32k的xml.so或xmlreader.so,但也需要libxml2.so,这是1.4megs .更多代码使得处理和使用更多内存需要更长时间.更不用说,由于其节点/树结构,XML具有循环引用,这可能是任何没有弱引用的语言的痛苦.我发现在几种语言中,XML解析器比任何对应的JSON解析器都大FAR(占用更多内存并使用更多内存). (5认同)
  • 我发现人类更容易解析JSON,但计算机解析XML更容易. (2认同)

Hib*_*u57 20

然而,处理速度可能不是唯一的相关问题,因为这是一个问题,这里是基准测试中的一些数字:JSON与XML:关于冗长的一些硬数字.对于速度,在这个简单的基准测试中,XML比JSON提供了21%的开销.

关于详细程度的一个重要说明,正如文章所说,最常见的抱怨:这在实践中并不那么重要(XML和JSON数据通常都不是由人类处理,而是由机器处理),即使是关于速度,它需要一些合理的时间来压缩.

此外,在此基准测试中,处理了大量数据,并且典型的Web应用程序将不会传输大小为90MB的此类大小的数据块,并且压缩可能不会有益(对于足够小的数据块,压缩块)将比未压缩的块更大,因此不适用.

尽管如此,如果不涉及压缩,JSON显然会更加轻松,特别是如果通过WebSocket连接进行传输,那么缺少经典的HTTP开销可能会使JSON的优势更加突出,甚至更多重大.

传输后,将消耗数据,并计入总处理时间.如果要传输大量或复杂的数据,缺少由验证XML解析器自动检查的模式,可能需要对JSON数据进行更多检查; 这些检查必须在JavaScript中执行,而这种检查并不是特别快,因此在这种情况下它可能会带来额外的XML开销.

无论如何,只有测试才能为您的特定用例提供答案(如果速度确实是唯一的问题,而不是标准,安全性和完整性......).

更新1:值得一提的是,EXI是一种二进制XML格式,它以比使用Gzip更低的成本提供压缩,并节省了解压缩压缩XML所需的处理.EXI是XML,BSON是JSON的.这里有一个快速概述,并提到空间和时间的效率:EXI:最后的二进制标准?.

更新2:W3C还存在二进制XML性能报告,因为效率和低内存以及CPU占用空间也是XML领域的问题:高效的XML交换评估.

更新2015-03-01

值得在此上下文中注意到,因为HTTP开销是一个问题:IANA已注册EXI编码(上面提到的高效二进制XML),作为HTTP协议的内容编码(以及compress,deflategzip) .这意味着EXI是可以预期浏览器可能在其他HTTP客户端之间理解的选项.请参阅超文本传输​​协议参数(iana.org).


Chr*_*lma 15

在数字集市上发现这篇文章真的很有趣.引用他们的报价来自Norm:

关于JSON专业人士:

如果你想绕过是原子值或列表或原子值的哈希值,JSON有很多的XML的优点:它是通过互联网直接地使用,支持多种应用,可以很容易地编写程序来处理JSON,它具有很少的可选功能,人性化且清晰,设计简洁,JSON文档易于创建,并且使用Unicode....

关于XML专业人士:

XML非常好地处理非结构化数据的丰富性.我并不担心XML的未来,即使它的死亡是由一群网络API设计师兴高采烈地庆祝的.

我无法抗拒说"我告诉你了!" 令牌在我的桌子上.我期待看到JSON人员在被要求开发更丰富的API时会做些什么.当他们想要交换结构不太好的数据时,他们会把它变成JSON吗?我偶尔会看到JSON的模式语言,其他语言会跟随吗?...

我个人同意Norm.我认为大多数针对XML的攻击来自Web开发人员的典型应用程序,而不是来自集成开发人员.但那是我的看法!;)

  • 说得好!如果 80% 的活跃开发者都是 javascript 小孩,那么 80% 的人会表达他们的观点,即 JSON“更好”。但任何使用类型化语言的人都会对 JSON 感到有点好笑。``{ "foo": 42 }`` 该对象是什么类型?然后,为了解决类型缺失的问题,会出现这样的内容:``{ "__type": "Bar", "foo": 42 }``。相反,在 XML 中,类型可以隐含到元素名称:``&lt;Bar&gt;&lt;foo&gt;42&lt;/foo&gt;&lt;/Bar&gt;``。只有 lisp 和 javascript 人才喜欢 json ;) (3认同)

Ger*_*ári 14

XML(可扩展标记语言)通常用于XHR,因为它是标准的广播语言,可以被任何编程语言使用,并且支持服务器和客户端,因此这是最灵活的解决方案.可以将XML分开以获得更多部分,以便指定的组可以开发程序的一部分,而不会影响其他部分.XML格式也可以由XML DTD或XML Schema(XSL)确定,并且可以进行测试.

JSON是一种数据交换格式,它作为JavaScript应用程序可能的格式变得越来越流行.基本上这是一个对象符号数组.JSON具有非常简单的语法,因此可以轻松学习.此外,JavaScript支持使用该eval函数解析JSON .另一方面,该eval功能有负面影响.例如,程序解析JSON的速度非常慢,并且由于安全性的原因,eval风险很大.这并不意味着JSON不好,只是我们必须更加小心.

我的建议是你应该将JSON用于轻量级数据交换的应用程序,比如游戏.因为您不必非常关心数据处理,所以这非常简单快捷.

XML最适合大型网站,例如购物网站或类似的东西.XML可以更安全和清晰.您可以创建基本的数据结构和模式,以便轻松测试校正并轻松地将其分成几部分.

我建议您使用XML因为速度和安全性,但JSON用于轻量级的东西.


God*_*her 6

关于JSON的重要一点是出于安全原因加密数据传输.毫无疑问,JSON比XML快得多.我已经看到XML占用100ms,因为JSON只需要60ms.JSON数据易于操作.

  • 我同意,JSON赢得了数据传输的战斗,但它缺乏标记,验证和元素的扩展.这就是谷歌抓取sitemap.xml而不是sitemap.json的原因 (5认同)