实际上,一个好的解析器可能会为你输入 age (另一方面,你可能不希望它) . 's going on when we access this data is - instead of doing an attribute lookup like in the JSON example above - we'在键 name 上进行 Map 查找 . 像这样形成XML可能更直观:
<person name="Danielle" age="12" />
但我们仍然需要进行 Map 查找才能访问我们的数据:
myObject = parseThatXMLPlease();
age = myObject.getChildren("person")[0].getAttr("age");
6 回答
在回答何时使用哪一个,有一点背景之前:
编辑:我应该提一下,这种比较实际上是从在JavaScript浏览器中使用它们的角度来看 . 它不是必须使用数据格式的方式,并且有很多好的解析器会改变细节以使我所说的不太有效 .
JSON更紧凑,并且(在我看来)更具可读性 - 在传输中它可以“更快”,因为传输的数据更少 .
在解析中,它取决于您的解析器 . 将代码(无论是JSON还是XML)转换为数据结构(如 Map )的解析器可能会受益于XML的严格性质(XML Schemas很好地消除数据结构的歧义) - 但是在JSON中,项目的类型(String / Number) / Nested JSON Object)可以在语法上推断,例如:
解析器不需要足够智能就能意识到
12
代表一个数字,(和Danielle
是一个像任何其他字符串一样的字符串) . 所以在javascript中我们可以这样做:在XML中,我们必须执行以下操作:
(顺便说一句,这说明了XML更加冗长;数据传输的一个问题) . 要使用这些数据,我们将通过解析器运行它,然后我们必须调用类似的东西:
实际上,一个好的解析器可能会为你输入
age
(另一方面,你可能不希望它) . 's going on when we access this data is - instead of doing an attribute lookup like in the JSON example above - we'在键name
上进行 Map 查找 . 像这样形成XML可能更直观:但我们仍然需要进行 Map 查找才能访问我们的数据:
编辑:原文:
这是误导性的:请记住,在JavaScript(和其他动态语言)中, Map 查找和字段查找之间没有区别 . 实际上,字段查找只是一个 Map 查找 .
如果您想进行真正有 Value 的比较,最好是对其进行基准测试 - 在您计划使用数据的上下文中执行基准测试 .
正如我一直打字的那样,Felix Kling已经提出了一个相当简洁的答案,比较它们何时使用每一个,所以我不再继续下去了 .
更快不是JSON或XML的属性,或者是这些属性之间的比较会产生的结果 . 如果有,则它是解析器的属性或传输数据的带宽 .
以下是(开头)JSON和XML的优缺点列表:
JSON
Pro:
简单语法,与XML相比,其开销更少"markup" .
易于使用JavaScript,因为标记是JS对象文字符号的子集,并且具有与JavaScript相同的基本数据类型 .
JSON Schema用于描述和数据类型以及结构验证
JsonPath用于提取深层嵌套结构中的信息
Con:
简单语法,仅支持少数几种不同的数据类型 .
不支持评论 .
XML
Pro:
广义标记;可以为任何目的创建"dialects"
XML Schema用于数据类型,结构验证 . 使它也可以创建新的数据类型
XSLT用于转换为不同的输出格式
XPath / XQuery用于在深层嵌套结构中提取信息
内置对名称空间的支持
Con:
所以最后你必须决定你需要什么 . 显然,这两种格式都有其合法用例 . 如果您主要使用JavaScript,那么您应该使用JSON .
请随意添加利弊 . 我不是XML专家;)
然而,处理速度可能不是唯一的相关问题,因为这是一个问题,以下是基准测试中的一些数字:JSON vs. XML: Some hard numbers about verbosity . 对于速度,在这个简单的基准测试中,XML比JSON提供了21%的开销 .
关于详细程度的一个重要说明,正如文章所说,最常见的抱怨:这在实践中并不那么重要(XML和JSON数据通常都不是由人类处理,而是由机器处理),即使是关于速度,它需要一些合理的时间压缩 .
此外,在此基准测试中,处理了大量数据,并且典型的Web应用程序将不会传输大小为90MB的此类大小的数据块,并且压缩可能不是有益的(对于足够小的数据块,压缩块)将比未压缩的块更大,因此不适用 .
尽管如此,如果不涉及压缩,JSON显然会更加轻松,特别是如果通过WebSocket连接进行传输,那么缺少经典的HTTP开销可能会使JSON的优势更加突出,甚至更多重大 .
传输后,将消耗数据,并计入总处理时间 . 如果要传输大量或复杂的数据,缺少由验证XML解析器自动检查的模式,可能需要对JSON数据进行更多检查;这些检查必须在JavaScript中执行,而这种检查并不是特别快,因此在这种情况下它可能会带来额外的XML开销 .
无论如何, only testing will provides the answer for your particular use‑case (如果速度真的是唯一的问题,而不是标准,也不是安全,也不是诚信......) .
更新1:值得一提的是,EXI是一种二进制XML格式,它以比使用Gzip更低的成本提供压缩,并节省了解压缩压缩XML所需的处理 . EXI是XML,BSON是JSON的 . 这里有一个快速概述,并提到空间和时间的效率: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客户端之间理解的选项 . 见Hypertext Transfer Protocol Parameters (iana.org) .
我发现this article at digital bazaar非常有趣 . 引用他们的报价来自Norm:
关于JSON专业人士:
关于XML专业人士:
我个人同意Norm . 我认为大多数针对XML的攻击来自Web开发人员的典型应用程序,而不是来自集成开发人员 . 但那是我的看法! ;)
XML(可扩展标记语言)通常用于XHR,因为它是标准的广播语言,可以被任何编程语言使用,并且支持服务器和客户端,因此这是最灵活的解决方案 . XML可以分开以获得更多部分,因此指定的组可以开发程序的一部分,而不会影响其他部分 . XML格式也可以由XML DTD或XML Schema(XSL)确定,并且可以进行测试 .
JSON是一种数据交换格式,它作为JavaScript应用程序可能的格式变得越来越流行 . 基本上这是一个对象符号数组 . JSON具有非常简单的语法,因此可以轻松学习 . 此外,JavaScript支持使用
eval
函数解析JSON . 另一方面,eval
函数有负数 . 例如,程序解析JSON的速度非常慢,并且由于安全性,eval
可能非常危险 . 这并不意味着JSON不好,只是我们必须更加小心 .我的建议是你应该将JSON用于轻量级数据交换的应用程序,比如游戏 . 因为您不必非常关心数据处理,所以这非常简单快速 .
XML最适合大型网站,例如购物网站或类似的东西 . XML可以更安全和清晰 . 您可以创建基本的数据结构和模式,以便轻松测试校正并轻松地将其分成几部分 .
我建议您使用XML因为速度和安全性,但JSON用于轻量级的东西 .
关于JSON的重要一点是出于安全原因加密数据传输 . 毫无疑问,JSON比XML快得多 . 我已经看到XML占用100ms,因为JSON只需要60ms . JSON数据易于操作 .