JSON和XML的比较

283

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


65
哪个方面更快呢?传输?处理?生成?它们都没有脚你知道的。很可能 JSON 某些方面比较“快”,因为它有较少的标记开销。另一方面,XML 提供了 XMLSchema 来确保类型和结构的有效性。还有 XSLT 可以将 XML 转换成几乎任何其他输出格式……这取决于你的需求 - Felix Kling
2
还要检查之前提出的其他问题:http://stackoverflow.com/search?q=json+vs+xml - Felix Kling
18
BLARG!这是我非常想知道的事情,很高兴在这里找到了答案,并且答案非常完美。s.e.管理员做得太糟糕了,也许现在是时候扩展你们的参与规则了。至少,能够回答这个问题真是太好了! - Mark Gerolimatos
我不在乎这篇文章是否来得太晚,但我同意。如果一个问题是重复的、无关的或与服务条款冲突,也许(关闭/无用的线程)不应该是搜索结果中出现的第一件事。(顺便说一下,这是第二个[重复]的结果)我同意,也许答案应该简洁明了,但如果结果接连不断地是关闭、未回答的线程,充满了离题的评论(这违反了使用条款),那么它对任何人都没有帮助。 - user4421333
2
尽管问题不太清楚,但这并不是基于个人观点的问题。 - qwr
6个回答

258
<不是JSON或XML的属性,也不是这两者之间比较的结果。如果有,则是解析器或传输数据的带宽的属性。> 以下是JSON和XML的优缺点列表(开头部分):

JSON

优点:

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

缺点:

  • 简单的语法,只支持少量不同的数据类型。

  • 不支持注释。


XML

优点:

  • 通用的标记语言;可以创建任何目的的“方言”
  • XML模式用于数据类型、结构验证。还可以创建新的数据类型
  • XSLT用于将XML文档转换为不同的输出格式
  • XPath/XQuery用于在深嵌套的结构中提取信息
  • 支持命名空间

缺点:

  • 与JSON相比相对啰嗦(导致传输相同数量的信息需要更多的数据)。

最终你必须决定你需要什么。很明显,这两种格式都有它们合理的使用情况。如果你主要使用JavaScript,那么你应该选择JSON。

请随意添加优缺点。我不是XML专家 ;)


22
JSON的缺点与XML的优点:JSON不支持对象引用(无论是循环还是非循环),而XML支持。XML通过强制在文档内使id属性唯一来实现此功能。 - Earth Engine
8
@EarthEngine,实际上Json.Net (http://json.codeplex.com/) 支持对象引用:http://james.newtonking.com/projects/json/help/index.html?topic=html/PreserveObjectReferences.htm。 - Dmitrii Lobanov
24
他们只是在JSON标准上添加了一些额外的限制,但它并没有被其他JSON工具所认可。因此,这不是JSON的“固有”属性。然而,对于XML,该限制已被写入标准,因此它是固有的。 - Earth Engine
5
JSON内置了数组和“null”值,而在XML中,你需要在模式解析器之间使用某种约定。此外,还有一些JSON的类似XSLT转换项目(例如https://github.com/emlynoregan/bOTLjs)。 - Vasyl Boroviak
2
JSON 的另一个缺点是它不支持注释,这会影响其完整性。 - LintfordPickle
显示剩余4条评论

228

回答何时使用哪个之前,先了解一些背景:

编辑:我应该提到,这个比较实际上是从在浏览器中使用JavaScript的角度出发的。这不是数据格式必须使用的方式,有很多好的解析器会改变细节,使得我的说法不完全正确。

JSON既更紧凑又更可读(在传输过程中可以更快地传输更少的数据)。

在解析方面,这取决于你的解析器。将代码(无论是JSON还是XML)转换为数据结构(如映射)的解析器可能会受益于XML严格的本质(XML模式能够清晰地区分数据结构),但在JSON中,项目的类型(字符串/数字/嵌套JSON对象)可以通过语法推断,例如:

myJSON = {"age" : 12,
          "name" : "Danielle"}

解析器不需要足够智能以意识到12代表一个数字(而Danielle像其他字符串一样)。因此,在javascript中,我们可以这样做:

anObject = JSON.parse(myJSON);
anObject.age === 12 // True
anObject.name == "Danielle" // True
anObject.age === "12" // False

在XML中,我们需要执行以下操作:
<person>
    <age>12</age>
    <name>Danielle</name>
</person>

(顺带提一下,这说明XML相对而言更加冗长,这是数据传输上的一个问题)。为了使用这个数据,我们需要将其通过解析器进行解析,然后需要调用类似以下代码的东西:

(作为旁注,这表明 XML 更加冗长;这是数据传输上的一项关注点)。为了使用此数据,我们需要经过解析器解析,然后需要调用类似以下方式的内容:

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

实际上,一个好的解析器可能会为您输入年龄(另一方面,您可能不希望它这样做)。当我们访问这些数据时,所发生的是 - 不像上面的JSON示例那样进行属性查找 - 我们在键“name”上执行映射查找。也许将XML格式化为这样更直观:
<person name="Danielle" age="12" />

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

myObject = parseThatXMLPlease();
age = myObject.getChildren("person")[0].getAttr("age");

编辑:原文:

在大多数编程语言中(并非全部),此类地图查找将比属性查找更为昂贵(例如我们在解析JSON时获得的内容)。

这是误导性的:请记住,在JavaScript(以及其他动态语言)中,没有区别地图查找和字段查找之间的区别。实际上,字段查找就是一种地图查找。

如果您想进行真正有价值的比较,请对其进行基准测试-在计划使用数据的环境中进行基准测试。

当我在打字时,Felix Kling已经提供了一个相当简洁的答案,比较它们何时使用每个答案,所以我不会再继续了。


只是一个吹毛求疵的注释... JavaScript 字段查找并不一定是映射查找。这取决于对象和所涉及的字段。小对象(特别是那些在构造后没有附加属性的对象)通常使用现代 JS 引擎中带有内联缓存的优化“快速类型”,并针对具有大量属性或对象结构经常更改的情况回退到较慢的属性包(映射查找)。 - Brandon Paddock
2
我发现JSON更容易被人类解析,但XML更容易被计算机解析。 - Jus12
5
举例来说,在PHP中,JSON使用json.so,大小为78k,并且没有任何依赖。而另一方面,XML需要xml.so或xmlreader.so,大小分别为54k/32k,但还需要libxml2.so,大小为1.4兆字节。代码越多,处理所需时间就越长,占用的内存也越多。更不用说,由于XML具有节点/树结构,其中可能存在循环引用,在任何没有弱引用的语言中都可能成为难题。我发现在几种语言中,XML解析器比任何对应的JSON解析器要大得多(占用更多内存并使用更多内存)。 - Rahly
1
由于许多解析器将数字字符串解释为数字,或将数字存储为数字字符串,因此@atilkan可能会受到影响。 - mazunki
https://continuity.nz/Content/Articles/AuthoringEfficientXML.pdf - muszeo
显示剩余2条评论

23

处理速度可能不是唯一相关的问题,然而,既然这是问题,这里有一些基准测试中的数字:JSON vs. XML: Some hard numbers about verbosity。在这个简单的基准测试中,XML比JSON多出21%的开销。

关于冗余性的重要说明,正如文章所说,这是最常见的抱怨之一:实际上并不是很重要(XML和JSON数据通常不是由人类处理,而是由机器处理),即使为了速度的考虑,压缩需要一些合理的额外时间。

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

尽管如此,如果没有压缩,JSON 显然更加简洁,将更轻巧地通过传输通道传输,特别是在通过 WebSocket 连接传输时,在那里,没有经典 HTTP 开销可能会使 JSON 的优势更加显著。

在传输后,数据需要被消耗,这对总体处理时间也有影响。如果要传输大或复杂的数据,则缺少验证 XML 解析器自动检查的模式可能需要在 JSON 数据上进行更多检查;这些检查必须在 JavaScript 中执行,而后者并不以特别快闻名,因此在这种情况下,它可能比XML更加繁琐。

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

更新1:值得一提的是EXI,这种二进制XML格式提供了比使用Gzip更低成本的压缩,并且节省了解压缩XML所需的处理过程。EXI就像BSON对JSON一样对XML进行了处理。在这里可以快速概述一下,同时还可以参考其在空间和时间方面的效率:EXI: The last binary standard?
更新2:W3C 还进行了一项二进制 XML 性能报告,因为效率、低内存和CPU占用也是 XML 领域的一个问题:Efficient XML Interchange Evaluation
更新于2015-03-01:值得注意的是,在这个背景下 HTTP 开销被提出了一个问题:IANA已经注册了EXI编码(上述高效的二进制XML),作为HTTP协议的“内容编码”(除了“compress”、“deflate”和“gzip”之外)。这意味着EXI是一个选项,可以预期浏览器及其他HTTP客户端会理解它。请看超文本传输协议参数 (iana.org)

就速度而言,在这个简单的基准测试中,XML相对于JSON表现出21%的开销。但是,根据使用的特定解析器,JSON解析存在很大差异。引用任何特定解析器几乎没有意义。XML也是如此。 - Jeffrey Blattman

19

我发现数字市集上这篇文章很有趣。引用他们从Norm那里引用的话:

关于JSON优点:

如果你想传递的只是原子值或原子值的列表或哈希,JSON具有许多XML的优点:它可以直接在互联网上使用,支持各种各样的应用程序,容易编写处理JSON的程序,可选特性较少,易于阅读和相对清晰,其设计是正式和简明的,JSON文档易于创建,并使用Unicode......

关于XML优点:

XML非常好地处理了非结构化数据的丰富性。即使一些Web API设计师欢呼XML的死亡,我也不担心XML的未来。

我不能抗拒将“我早就告诉过你!”的令牌藏在我的桌子里。我期待看到当JSON的开发者被要求开发更丰富的API时,他们会做什么。当他们想要交换结构不太良好的数据时,他们会把它塞进JSON吗?我偶尔看到JSON的模式语言的提及,其他语言会跟随吗?......

我个人同意Norm的观点。我认为大多数对XML的攻击来自于针对典型应用程序的Web开发人员,而不是集成开发人员。但这只是我的观点!;)


3
说得好!如果80%的活跃开发人员是JavaScript新手,那么80%的人会声称JSON更好。但是,任何使用类型语言的人都会对JSON感到有些好笑。{ "foo": 42 } 这个对象是什么类型?然后,为了解决缺乏类型的问题,就会出现这样的东西:{ "__type": "Bar", "foo": 42 }。相比之下,在XML中,类型可以被赋予元素名称:<Bar><foo>42</foo></Bar>。只有Lisp和JavaScript的人喜欢JSON ;) - BitTickler

16
XML(可扩展标记语言)通常用于XHR,因为它是一种标准广播语言,可以被任何编程语言使用,并且支持服务器和客户端,所以这是最灵活的解决方案。XML可以分成更多部分,因此指定组可以开发程序的某个部分,而不会影响其他部分。XML格式也可以由XML DTD或XML模式(XSL)确定并进行测试。
JSON是一个数据交换格式,作为JavaScript应用程序可能的格式而变得越来越流行。基本上,这是一个对象符号数组。JSON具有非常简单的语法,因此很容易学习。同时,JavaScript支持使用eval函数解析JSON。另一方面,eval函数也有负面影响。例如,解析JSON的程序可能非常慢,由于安全性,eval可能非常危险。这并不意味着JSON不好,只是我们必须更加小心。
我的建议是,您应该将JSON用于轻量级数据交换的应用程序,例如游戏。因为您不必真正关心数据处理,这非常简单快速。
XML最适合更大的网站,例如购物网站或类似网站。 XML可以更安全,更清晰。您可以创建基本数据结构和模式以轻松测试其纠正,并将其分成易于管理的部分。
我建议您使用XML,因为它速度快且安全,但对于轻量级的东西,请使用JSON。

我没有点踩,但我很好奇你是如何认为 JSON 是一个更重的负载或者一般来说更慢的。可以应用 GZip/Deflate 压缩。它的语法本质上使得它在字节方面更小。JSON 也可以定义它的模式作为一个合同,并且可以轻松地序列化。 - Anthony Mason
JSON不需要被eval(求值)就可以被解析。 - Yay295

5

JSON的重要之处在于出于安全原因需要保持数据传输加密。毫无疑问,JSON比XML快得多得多。我曾经看到XML需要100ms,而JSON只需要60ms。JSON数据易于操作。


5
我同意,JSON在数据传输方面胜出,但在标记、验证和扩展元素方面不足。这就是为什么Google爬取sitemap.xml而不是sitemap.json的原因。 - eQ19
1
网站地图在 JSON 流行之前就已经定义了,所以这不是最好的例子。网站地图也被视为服务器到服务器的通信方式,其中 XML 比 JSON 更受欢迎。(JSON 之所以流行,主要是因为在 JavaScript 中易于使用。) - Matthew Whited
但是Google AMP使用JSON而不是XML。 - Ashraf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接