XML与JSON优劣对比

应用开发2025-11-05 14:02:37615

简介

XML 和 JSON 是劣对现今互联网中最常用的两种数据交换格式。XML 格式由 W3C 于 1996 年提出。劣对JSON 格式由 Douglas Crockford 于 2002 年提出。劣对虽然这两种格式的劣对设计目标并不相同,但它们常常用于同一个任务,劣对也就是劣对数据交换中。XML 和 JSON 的劣对文档都很完善(RFC 7159[1]、RFC 4825[2]),劣对且都同时具有人类可读性human-readable和机器可读性machine-readable。劣对这两种格式并没有哪一个比另一个更强,劣对只是劣对各自适用的领域不用。(LCTT 译注:W3C 是劣对互联网联盟[3],制定了各种 Web 相关的劣对标准,如 HTML、劣对CSS 等。劣对Douglas Crockford 除了制定了 JSON 格式,还致力于改进 JavaScript,开发了 JavaScript 相关工具 JSLint[4] 和 JSMin[5])

XML 的优点

XML 与 JSON 相比有很多优点。二者间最大的不同在于 XML 可以通过在标签中添加属性这一简单的方法来存储元数据metadata。而使用 JSON 时需要创建一个对象,把元数据当作对象的成员来存储。云南idc服务商虽然二者都能达到存储元数据的目的,但在这一情况下 XML 往往是更好的选择,因为 JSON 的表达形式会让客户端程序开发人员误以为要将数据转换成一个对象。举个例子,如果你的 C++ 程序需要使用 JSON 格式发送一个附带元数据的整型数据,需要创建一个对象,用对象中的一个名称/值对name/value pair来记录整型数据的值,再为每一个附带的属性添加一个名称/值对。接收到这个 JSON 的程序在读取后很可能把它当成一个对象,可事实并不是这样。虽然这是使用 JSON 传递元数据的一种变通方法,但他违背了 JSON 的核心理念:“JSON 的结构与常规的程序语言中的结构相对应,而无需修改。JSON’s structures look like conventional programming language structures. No restructuring is necessary.”1

虽然稍后我会说这也是 XML 的b2b供应网一个缺点,但 XML 中对命名冲突、前缀prefix的处理机制赋予了它 JSON 所不具备的能力。程序员们可以通过前缀来把统一名称给予两个不同的实体。2 当不同的实体在客户端中使用的名称相同时,这一特性会非常有用。

XML 的另一个优势在于大多数的浏览器可以把它以具有高可读性和强组织性的方式highly readable and organized way展现给用户。XML 的树形结构让它易于结构化,浏览器也让用户可以自行展开或折叠树中的元素,这简直就是调试的福音。

XML 对比 JSON 有一个很重要的优势就是它可以记录混合内容mixed content。例如在 XML 中处理包含结构化标记的字符串时,程序员们只要把带有标记的文本放在一个标签内就可以了。可因为 JSON 只包含数据,没有用于指明标签的简单方式,虽然可以使用处理元数据的服务器租用解决方法,但这总有点滥用之嫌。

JSON 的优点

JSON 自身也有很多优点。其中最显而易见的一点就是 JSON 比 XML 简洁得多。因为 XML 中需要打开和关闭标签,而 JSON 使用名称/值对表示数据,使用简单的 { 和 } 来标记对象,[和 ] 来标记数组,, 来表示数据的分隔,: 表示名称和值的分隔。就算是使用 gzip 压缩,JSON 还是比 XML 要小,而且耗时更少。3 正如 Sumaray 和 Makki 在实验中指出的那样,JSON 在很多方面都比 XML 更具优势,得出同样结果的还有 Nurseitov、Paulson、Reynolds 和 Izurieta。首先,由于 JSON 文件天生的简洁性,与包含相同信息的 XML 相比,JSON 总是更小,这意味着更快的传输和处理速度。第二,在不考虑大小的情况下,两组研究 4 5 表明使用 JSON 执行序列化和反序列化的速度显著优于使用 XML。第三,后续的研究指出 JSON 的处理在 CPU 资源的使用上也优于 XML。研究人员发现 JSON 在总体上使用的资源更少,其中更多的 CPU 资源消耗在用户空间,系统空间消耗的 CPU 资源较少。这一实验是在 RedHat 的设备上进行的,RedHat 表示更倾向于在用户空间使用 CPU 资源。6 不出意外,Sumaray 和 Makki 在研究里还说明了在移动设备上 JSON 的性能也优于 XML。7 这是有道理的,因为 JSON 消耗的资源更少,而移动设备的性能也更弱。

JSON 的另一个优点在于其对对象和数组的表述和宿主语言host language中的数据结构相对应,例如对象object、记录record、结构体struct、字典dictionary、哈希表hash table、键值列表keyed list还有数组array、向量vector、列表list,以及对象组成的数组等等。8 虽然 XML 里也能表达这些数据结构,也只需调用一个函数就能完成解析,而往往需要更多的代码才能正确的完成 XML 的序列化和反序列化处理。而且 XML 对于人类来说不如 JSON 那么直观,XML 标准缺乏对象、数组的标签的明确定义。当结构化的标记可以替代嵌套的标签时,JSON 的优势极为突出。JSON 中的花括号和中括号则明确表示了数据的结构,当然这一优势也包含前文中的问题,在表示元数据时 JSON 不如 XML 准确。

虽然 XML 支持命名空间namespace与前缀prefix,但这不代表 JSON 没有处理命名冲突的能力。比起 XML 的前缀,它处理命名冲突的方式更简洁,在程序中的处理也更自然。在 JSON 里,每一个对象都在它自己的命名空间中,因此不同对象内的元素名称可以随意重复。在大多数编程语言中,不同的对象中的成员可以包含相同的名字,所以 JSON 根据对象进行名称区分的规则在处理时更加自然。

也许 JSON 比 XML 更优的部分是因为 JSON 是 JavaScript 的子集,所以在 JavaScript 代码中对它的解析或封装都非常的自然。虽然这看起来对 JavaScript 程序非常有用,而其他程序则不能直接从中获益,可实际上这一问题已经被很好的解决了。现在 JSON 的网站的列表上展示了 64 种不同语言的 175 个工具,它们都实现了处理 JSON 所需的功能。虽然我不能评价大多数工具的质量,但它们的存在明确了开发者社区拥抱 JSON 这一现象,而且它们切实简化了在不同平台使用 JSON 的难度。

二者的动机

简单地说,XML 的目标是标记文档。这和 JSON 的目标想去甚远,所以只要用得到 XML 的地方就尽管用。它使用树形的结构和包含语义的文本来表达混合内容以实现这一目标。在 XML 中可以表示数据的结构,但这并不是它的长处。

JSON 的目标是用于数据交换的一种结构化表示。它直接使用对象、数组、数字、字符串、布尔值这些元素来达成这一目标。这完全不同于文档标记语言。正如上面说的那样,JSON 没有原生支持混合内容mixed content的记录。

软件

这些主流的开放 API 仅提供 XML:亚马逊产品广告 APIAmazon Product Advertising API。

这些主流 API 仅提供 JSON:脸书图 APIFacebook Graph API、谷歌地图 APIGoogle Maps API、推特 APITwitter API、AccuWeather API、Pinterest API、Reddit API、Foursquare API。

这些主流 API 同时提供 XML 和 JSON:谷歌云存储Google Cloud Storage、领英 APILinkedin API、Flickr API。

根据可编程网络Programmable Web 9 的数据,最流行的 10 个 API 中只有一个是仅提供 XML 且不支持 JSON 的。其他的要么同时支持 XML 和 JSON,要么只支持 JSON。这表明了大多数应用开发者都更倾向于使用支持 JSON 的 API,原因大概是 JSON 更快的处理速度与良好口碑,加之与 XML 相比更加轻量。此外,大多数 API 只是传递数据而非文档,所以 JSON 更加合适。例如 Facebook 的重点在于用户的交流与帖子,谷歌地图则主要处理坐标和地图信息,AccuWeather 就只传递天气数据。总之,虽然不能说天气 API 在使用时究竟是 JSON 用的多还是 XML 用的多,但是趋势明确偏向了 JSON。10 11

这些主流的桌面软件仍然只是用 XML:Microsoft Word、Apache OpenOffice、LibraOffice。

因为这些软件需要考虑引用、格式、存储等等,所以比起 JSON,XML 优势更大。另外,这三款程序都支持混合内容,而 JSON 在这一点上做得并不如 XML 好。举例说明,当用户使用 Microsoft Word 编辑一篇论文时,用户需要使用不同的文字字形、文字大小、文字颜色、页边距、段落格式等,而 XML 结构化的组织形式与标签属性生来就是为了表达这些信息的。

这些主流的数据库支持 XML:IBM DB2、Microsoft SQL Server、Oracle Database、PostgresSQL、BaseX、eXistDB、MarkLogic、MySQL。

这些是支持 JSON 的主流数据库:MongoDB、CouchDB、eXistDB、Elastisearch、BaseX、MarkLogic、OrientDB、Oracle Database、PostgreSQL、Riak。

在很长一段时间里,SQL 和关系型数据库统治着整个数据库市场。像甲骨文Oracle和微软Microsoft这样的软件巨头都提供这类数据库,然而近几年 NoSQL 数据库正逐步受到开发者的青睐。也许是正巧碰上了 JSON 的普及,大多数 NoSQL 数据库都支持 JSON,像 MongoDB、CouchDB 和 Riak 这样的数据库甚至使用 JSON 来存储数据。这些数据库有两个重要的特性是它们适用于现代网站:一是它们与关系型数据库相比更容易扩展more scalable;二是它们设计的目标就是 web 运行所需的核心组件。12 由于 JSON 更加轻量,又是 JavaScript 的子集,所以很适合 NoSQL 数据库,并且让这两个品质更容易实现。此外,许多旧的关系型数据库增加了 JSON 支持,例如 Oracle Database 和 PostgreSQL。由于 XML 与 JSON 间的转换比较麻烦,所以大多数开发者会直接在他们的应用里使用 JSON,因此开发数据库的公司才有支持 JSON 的理由。(LCTT 译注:NoSQL 是对不同于传统的关系数据库的数据库管理系统的统称。参考来源[6]) 13

未来

对互联网的种种变革中,最让人期待的便是物联网Internet of Things(IoT)。这会给互联网带来大量计算机之外的设备,例如手表、温度计、电视、冰箱等等。这一势头的发展良好,预期在不久的将来迎来爆发式的增长。据估计,到 2020 年时会有 260 亿 到 2000 亿的物联网设备被接入互联网。14 15 几乎所有的物联网设备都是小型设备,因此性能比笔记本或台式电脑要弱很多,而且大多数都是嵌入式系统。因此,当它们需要与互联网上的系统交换数据时,更轻量、更快速的 JSON 自然比 XML 更受青睐。16 受益于 JSON 在 web 上的快速普及,与 XML 相比,这些新的物联网设备更有可能从使用 JSON 中受益。这是一个典型的梅特卡夫定律的例子,无论是 XML 还是 JSON,抑或是什么其他全新的格式,现存的设备和新的设备都会从支持最广泛使用的格式中受益。

Node.js 是一款服务器端的 JavaScript 框架,随着她的诞生与快速成长,与 MongoDB 等 NoSQL 数据库一起,让全栈使用 JavaScript 开发成为可能。这些都预示着 JSON 光明的未来,这些软件的出现让 JSON 运用在全栈开发的每一个环节成为可能,这将使应用更加轻量,响应更快。这也是任何应用的追求之一,所以,全栈使用 JavaScript 的趋势在不久的未来都不会消退。17

此外,另一个应用开发的趋势是从 SOAP 转向 REST。18 19 20 XML 和 JSON 都可以用于 REST,可 SOAP 只能使用 XML。

从这些趋势中可以推断,JSON 的发展将统一 Web 的信息交换格式,XML 的使用率将继续降低。虽然不应该把 JSON 吹过头了,因为 XML 在 Web 中的使用依旧很广,而且它还是 SOAP 的唯一选择,可考虑到 SOAP 到 REST 的迁移,NoSQL 数据库和全栈 JavaScript 的兴起,JSON 卓越的性能,我相信 JSON 很快就会在 Web 开发中超过 XML。至于其他领域,XML 比 JSON 更好的情况并不多。

角注

1. Introducing JSON[7]

2. XML Tutorial[8]

3. JSON vs. XML: Some hard numbers about verbosity[9]

4. Comparison of JSON and XML Data Interchange Formats: A Case Study[10]

5. A comparison of data serialization formats for optimal efficiency on a mobile platform[11]

6. Comparison of JSON and XML Data Interchange Formats: A Case Study[10]

7. A comparison of data serialization formats for optimal efficiency on a mobile platform[11]

8. Introducing JSON[7]

9. Most Popular APIs: At Least One Will Surprise You[12]

10. Why JSON will continue to push XML out of the picture[13]

11. Thousands of APIs Paint a Bright Future for the Web[14]

12. Why JSON will continue to push XML out of the picture[13]

13. How JSON sparked NoSQL – and will return to the RDBMS fold[15]

14. A Simple Explanation Of ‘The Internet Of Things’[16]

15. Proofpoint Uncovers Internet of Things (IoT) Cyberattack[17]

16. Why JSON will continue to push XML out of the picture[13]

17. Why JSON will continue to push XML out of the picture[13]

18. Thousands of APIs Paint a Bright Future for the Web[14]

19. 3,000 Web APIs: Trends From A Quickly Growing Directory[18]

20. How REST replaced SOAP on the Web: What it means to you[19]

本文地址:http://www.bzve.cn/news/25d66599309.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

热门文章

全站热门

安装Ubuntu/Debian 提供了三个不同的 Pure-FTPd 的 deb 安装包,分别是 pure-ftpd、pure-ftpd-ldap 和 pure- ftpd-mysql,其中 ldap 和 mysql 分别表示 Pure-FTPd 跟 ldap 和 mysql 集成,另外这三个包都依赖于 pure-ftpd-common。假如我们不需要 ldap 和 mysql 的话,选择 pure-ftpd 就可以了。通过 pure-ftpd-wrapper 的手册页我们可以得到可用的配置文件选项列表:下面是前面我们介绍的第二种方式的配置文件,我们这儿可以将其作为第三种方式来理解。比如要限制所有用户在其主目录中,在 /etc/pure-ftpd/conf 中创建一个名为 ChrootEveryone 的文件,里面加入一行内容:yes 即可。# 限制所有用户在其主目录中ChrootEveryone yes# 假如前一个指令被设置为了 no,下面组的成员(GID)就不受主目录的限制了。而其他的用户还是# 会被限制在自己的主目录里。假如你不想把任何用户限制在自己的主目录里,只要注释掉 ChrootEveryone# 和 TrustedGID 就可以了。# TrustedGID 100# 兼容ie等比较非正规化的ftp客户端BrokenClientsCompatibility no# 服务器总共允许同时连接的最大用户数MaxClientsNumber 50# 做为守护(doemon)进程运行(Fork in background)Daemonize yes# 同一IP允许同时连接的用户数(Maximum number of sim clients with the same IP address)MaxClientsPerIP 8# 假如你要记录所有的客户命令,设置这个指令为 yes。# This directive can be duplicated to also log server responses.VerboseLog no# 即使客户端没有发送 -a 选项也列出隐藏文件( dot-files )。DisplayDotFiles yes# 不允许认证用户 - 仅作为一个公共的匿名FTP。AnonymousOnly no# 不允许匿名连接,仅允许认证用户使用。NoAnonymous no# Syslog facility (auth, authpriv, daemon, ftp, security, user, local*)# 缺省的功能( facility )是 ftp。 none 将禁止日志。SyslogFacility ftp# 定制用户登陆后的显示信息(Display fortune cookies)# FortunesFile /usr/share/fortune/zippy# 在日志文件中不解析主机名。日志没那么详细的话,就使用更少的带宽。在一个访问量很大# 的站点中,设置这个指令为 yes ,假如你没有一个能工作的DNS的话。DontResolve yes# 客户端允许的最大的空闲时间(分钟,缺省15分钟)MaxIdleTime 15# LDAP 配置文件 (参考 README.LDAP)# LDAPConfigFile /etc/pureftpd-ldap.conf# MySQL 配置文件 (参考 README.MySQL)# MySQLConfigFile /etc/pureftpd-mysql.conf# Postgres 配置文件 (参考 README.PGSQL)# PGSQLConfigFile /etc/pureftpd-pgsql.conf# PureDB 用户数据库 (参考 README.Virtual-Users)# PureDB /etc/pureftpd.pdb# pure-authd 的socket 路径(参考 README.Authentication-Modules)# ExtAuth /var/run/ftpd.sock# 假如你要启用 PAM 认证方式, 去掉下面行的注释。# PAMAuthentication yes# 假如你要启用 简单的 Unix系统 认证方式(/etc/passwd), 去掉下面行的注释。# UnixAuthentication yes# 请注意,LDAPConfigFile, MySQLConfigFile, PAMAuthentication 和# UnixAuthentication 这些指令只能被使用一次,不过,他们能被混合在一起用。例如:假如你使用了# MySQLConfigFile 和 UnixAuthentication,那么 SQL 服务器将被访问。假如因为用户名未找# 到而使 SQL 认证失败的话,就会在/etc/passwd 和 /etc/shadow 中尝试另外一种认证,假如因# 为密码错误而使 SQL 认证失败的话,认证就会在此结束了。认证方式由它们被给出来的顺序而被链# 接了起来。# ls 命令的递归限制。第一个参数给出文件显示的最大数目。第二个参数给出最大的子目录深度。LimitRecursion 2000 8# 允许匿名用户创建新目录?AnonymousCanCreateDirs no# 假如系统被 loaded 超过下面的值,匿名用户会被禁止下载。MaxLoad 4# 被动连接响应的端口范围。- for firewalling.# PassivePortRange 30000 50000# 强制一个IP地址使用被动响应( PASV/EPSV/SPSV replies)。 - for NAT.# Symbolic host names are also accepted for gateways with dynamic IP# addresses.# ForcePassiveIP 192.168.0.1# 匿名用户的上传/下载的比率。# AnonymousRatio 1 10# 所有用户的上传/下载的比率。# This directive superscedes the previous one.# UserRatio 1 10# 不接受所有者为 ftp 的文件的下载。例如:那些匿名用户上传后未被本地管理员验证的文件。AntiWarez yes第二个文件# 客户端登录的时候的默认编码,开启这个选项的话,windows登录时就不会显示不了中文的了ClientCharset gbk# 服务监听的IP 地址和端口。(缺省是所有IP地址和21端口)# Bind 127.0.0.1,21# 匿名用户的最大带宽(KB/s)。# AnonymousBandwidth 8# 所有用户的最大带宽(KB/s),包括匿名用户。# Use AnonymousBandwidth *or* UserBandwidth, both makes no sense.# UserBandwidth 8# 新建目录及文件的属性掩码值。<文件掩码>;:<目录掩码>; .# 177:077 if you feel paranoid.Umask 133:022# 认证用户允许登陆的最小组ID(UID) 。MinUID 100# 仅允许认证用户进行 FXP 传输。AllowUserFXP yes# 对匿名用户和非匿名用户允许进行匿名 FXP 传输。AllowAnonymousFXP no# 用户不能删除和写点文件(文件名以 . 开头的文件),即使用户是文件的所有者也不行。# 假如 TrustedGID 指令是 enabled ,文件所属组用户能够访问点文件(dot-files)。ProhibitDotFilesWrite no# 禁止读点文件(文件名以 . 开头的文件) (.history, .ssh...)ProhibitDotFilesRead no# 永不覆盖文件。当上传的文件,其文件名已经存在时,自动重命名,如: file.1, file.2, file.3, ...AutoRename no# 不接受匿名用户上传新文件( no = 允许上传)AnonymousCantUpload no# 仅允许来自以下IP地址的非匿名用户连接。你可以使用这个指令来打开几个公网IP来提供匿名FTP,# 而保留一个私有的防火墙保护的IP来进行远程管理。你还可以只允许一内网地址进行认证,而在另外# 一个IP上提供纯匿名的FTP服务。#TrustedIP 10.1.1.1# 假如你要为日志每一行添加 PID 去掉下面行的注释。# LogPID yes# 使用类似于Apache的格式创建一个额外的日志文件,如:# fw.c9x.org - jedi [13/Dec/1975] GET /ftp/linux.tar.bz2 200 21809338# 这个日志文件能被 www 流量分析器处理。# AltLog clf:/var/log/pureftpd.log# 使用优化过的格式为统计报告创建一个额外的日志文件。# AltLog stats:/var/log/pureftpd.log# 使用标准的W3C格式创建一个额外的日志文件。(与大部分的商业日志分析器兼容)# AltLog w3c:/var/log/pureftpd.log# 不接受 CHMOD 命令。用户不能更改他们文件的属性。# NoChmod yes# 允许用户恢复和上传文件,却不允许删除他们。# KeepAllFiles yes# 用户主目录不存在的话,自动创建。# CreateHomeDir yes# 启用虚拟的磁盘限额。第一个数字是最大的文件数。# 第二个数字是最大的总的文件大小(单位:Mb)。# 所以,1000:10 就限制每一个用户只能使用 1000 个文件,共10Mb。# Quota 1000:10# 假如你的 pure-ftpd 编译时加入了独立服务器( standalone )支持,你能够改变 pid 文件# 的位置。缺省位置是 /var/run/pure-ftpd.pid 。# PIDFile /var/run/pure-ftpd.pid# 假如你的 pure-ftpd 编译时加入了 pure-uploadscript 支持,这个指令将会使 pure-ftpd# 发送关于新上传的情况信息到 /var/run/pure-ftpd.upload.pipe,这样 pure-uploadscript# 就能读然后调用一个脚本去处理新的上传。# CallUploadScript yes# 这个选项对允许匿名上传的服务器是有用的。当 /var/ftp 在 /var 里时,需要保留一定磁盘空间# 来保护日志文件。当所在磁盘分区使用超过百分之 X 时,将不在接受新的上传。MaxDiskUsage 99# 假如你不想要你的用户重命名文件的话,就设置为 yes 。# NoRename yes# 是 customer proof : 工作区(workaround)反对普通的客户错误,类似于:chmod 0 public_html 的错误。# 那是一个有效的命令,不过,将导致无知的客户所定他们自己的文件,将使你的技术支持忙于愚蠢的的问题中。# 假如你确信你所有的用户都有基本的Unix知识的话,这个特性将没什么用了。不过,假如你是一个主机提供商# 的话,启用它。CustomerProof yes# 每一个用户的并发限制。只有在添加了 --with-peruserlimits 编译选项进行编译后,这个指令才起# 作用。(大部分的二进制的发布版本就是例子)# 格式是 : <每一个用户最大允许的进程>;:<最大的匿名用户进程>;# 例如: 3:20 意思是同一个认证用户最大可以有3个同时活动的进程。而且同时最多只能有20个匿名用户进程。# PerUserLimits 3:20

徕卡相机质量如何?(探究徕卡相机质量的优势与劣势)

如何正确安装无线网卡(详细教程及注意事项)

汀山金河田的旅游魅力(探索自然之美,领略文化之韵)

最近在做一个电子书生成的项目,需要根据电子书的内容资源在线添加后自动打包成不同的包名的APK,同时自动添加各个市场渠道等内容信息,由于需要与后端联动,一键生成,所以必须在服务器上进行Android项目的打包生成,因为服务器是UbuntuServer,没有图像界面,所有只能搭建一个命令行环境,直接执行ant脚本打包,找了一下资料,根据自己的环境配置搭建过程与大家分享Ant环境准备复制代码代码如下: sudo apt-get install ant复制代码代码如下: tar -xf apache-ant-1.8.2-bin.tar.gz复制代码代码如下:复制代码代码如下: ant -version复制代码代码如下: unzip adt-bundle-linux-x86_64-20130729.zip复制代码代码如下: cp ./adt-bundle-linux-x86_64-20130729/sdk/ /opt/sdk复制代码代码如下: vim /etc/bash.bashrc复制代码代码如下:复制代码代码如下: android create project --target android-18 --name APP --path App --activity MainActivity --package com.yourtion.android复制代码代码如下: sudo apt-get install openjdk-7-jre openjdk-7-jdk openjdk-7-jre-lib这样环境就基本OK了,大家使用过程还有什么问题欢迎一起交流!

RadeonHD8400(发挥游戏和多媒体表现的终极选择)

以乐心mambowatch为主题的智能手表体验报告(了解乐心mambowatch的功能与特点,发现智能手表的魅力)

华为5x手机的价格与性能对比(华为5x是一个性价比高的选择)

友情链接

滇ICP备2023006006号-39