【编者按】本文作者 Yegor Bugayenko 是 Teamed.io 公司的联合创始人,在软件质量和工程管理方法领域有深入的研究。本文中,作者通过对比 JSON ,向大家更详细地阐述了 XML 的四大特性,帮助大家在搭建项目时选择适合的数据格式类型。

很多人都在心里纠结,如果 JSON 和 XML 相比,谁更好谁更快?在接下来的新项目中到底选择哪一个?别傻了!完全没有可比性。就像自行车和 AMG S65 ,你能说哪个更好吗?虽然两者都是交通工具,但有些情况下,自行车反而更便捷。所以 JSON 和 XML 也一样,它们都各有所长,完全没有必要进行比较。

下面举一个简单的 JSON 数据(140个字符):

{
"id": 123,
"title": "Object Thinking",
"author": "David West",
"published": {
"by": "Microsoft Press",
"year": 2004
}
}

同样的数据在 XML 中会表示如下(167个字符):

<?xml version="1.0"?>
<book id="123">
<title>Object Thinking</title>
<author>David West</author>
<published>
<by>Microsoft Press</by>
<year>2004</year>
</published>
</book>

很容易看出其中的区别,前者更简洁更容易理解,而且能在JavaScript 中能完美解析。所以,我们便可以简单粗暴地放弃 XML 选择 JSON 了吗?谁还会需要已历时15年的重量级语言呢?

但恰恰相反,本人就非常喜爱 XML ,且听下文分解。

但千万别误会,本文并不是在反对 JSON 。 JSON 的确是很好的数据格式,但它仅仅只是一种数据格式,经常被临时用于将数据从 A 点传到 B 点。它比 XML 更简短易读,但仅此而已。

XML 是一种非常强大的语言,而非只是单纯的数据格式。相对于 JSON 和其他简单的数据格式来说,如 YAML ,XML 至少有以下四个重要特性。

  • XPath

为了从文档中得到上文类似的出版年份,只需要发送一个简单的 XPath 请求:/book/published/year/text() 。但是,必须得有一个 XPath 处理器来解析请求并返回2004。好就好在 XPath2.0是集 functions、predicates、axes 等为一体的强大检索引擎,在不用 Java 代码编写任何遍历的逻辑的情况下,就可以在 XPath 请求中以自然语言形式加入任何逻辑,例如,你可以直接发出请求 “How many books were published by David West in 2004?” ,便能通过 XPath 得到答案。而这是 JSON 所不能做到的。

  • Attributes and Namespaces

可以将 metadata 加到 XML 数据中,正如上面的 id 属性一样。数据保存在元素中,例如图书作者的姓名,而 metadata(数据的数据)应该保存为属性,这会大大有利于组织和结构化信息。最重要的是,元素和属性都可以标记为属于某个 namespaces ,当多个应用使用同一 XML 文档时,这种技术的优势会非常明显。

  • XML Schema

试想这样的情况,当你在一台机器上创建了 XML 文档,在其他电脑上做了数次修改,然后又传到别的电脑上使用,所以必须确保文档结构没有被中间操作所破坏。比如可能有人用 保存出版日期,但别人又可能使用 ISO-8601 格式的 。为了避免这样的结构混乱,我们可以创建一个说明文档 XML Schema ,和主文档一起进行保存。在每次操作主文档之前,都需要通过 schema 文件检查其正确性,这是生产过程中的一种集成测试。 RelaxNG 也是类似的机制,但会简单很多,如果觉得 XML Schema 太过复杂不妨尝试用 RelaxNG。

  • XSL

事实上,可以不用任何 Java/Ruby 等代码就能完成 XML 文档的修改。简单的说,你只需要创建一个 XSL transformation 文档并将其应用于原始 XML ,然后得到一个新的 XML 。 XSL 语言(纯功能性语言)是专为分层数据操作设计的,它比 Java 或任何其他面向对象/过程的语言都更适合这一任务。借助 XSL 可以将 XML 转换为任何形式,包括纯文本和 HTML 。很多人抱怨 XSL 太复杂,但其实没那么难, XSL 的核心功能其实很简单,大家不妨一试。

以上所述并不是 XML 的全部特征,但这四大特性的确用途非凡。它们不仅可以让文档的“自给自足”,还能进行自我验证(XML Schema),进而知道如何修改(XSL),最后还能方便地获得其中的文档内容(Xpath)。

同时,市面上还有很多以 XML 为基础发展的语言、标准和应用,包括 Xforms、 SVG、 MathML、 RDF、 OWL、 WSDL 等。但一般的主流项目中都不会用到,因为它们的针对性都太强。

设计 JSON 的用途并非是满足以上特性,尽管 JSON 领域现在努力尝试,包括用于查询的 JSONPath 、一些转换工具和用于验证的 json-schema ,但和强大的 XML 相比这只是微不足道的模仿,笔者并不认为会有长远发展,而且迟早会消失殆尽。

综上所述, JSON 是一种没有过多附加功能的简单数据格式,其最佳的使用情况是在 AJAX 下,除此之外,本人都强烈推荐大家使用 XML。

(编译自:https://dzone.com/articles/stop-comparing-json-and-xml

OneAPM 为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

JSON和XML:不可同日而语的更多相关文章

  1. protocol buffers vs json vs XML

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com   在分布式系统中,数据序列化传递的情形非常常见,主流的三种,JSON.XML.Protobuf.   XML现在 ...

  2. .NET Core采用的全新配置系统[6]: 深入了解三种针对文件(JSON、XML与INI)的配置源

    物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  3. iOS - 分析JSON、XML的区别和解析方式的底层是如何实现的(延伸实现原理)

    <分析JSON.XML的区别,JSON.XML解析方式的底层是如何实现的(延伸实现原理)> (一)JSON与XML的区别: (1)可读性方面:基本相同,XML的可读性比较好: (2)可扩展 ...

  4. staxon实现json和xml互转

    pom.xml: <dependency> <groupId>de.odysseus.staxon</groupId> <artifactId>stax ...

  5. JSON与XML的区别比较

    1.定义介绍 (1).XML定义扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许 ...

  6. PHP如何自动识别第三方Restful API的内容,自动渲染成 json、xml、html、serialize、csv、php等数据

    如题,PHP如何自动识别第三方Restful API的内容,自动渲染成 json.xml.html.serialize.csv.php等数据? 其实这也不难,因为Rest API也是基于http协议的 ...

  7. 【Yii2-CookBook】JSON 和 XML 输出

    Web 和移动应用程序现在不仅仅只是用来呈现 HTML. 现在开发一个移动客户端,利用服务器 api 驱动前端,所有的用户交互都在客户端哪里.JSON 和 XML 格式通常用于序列化和传输结构化数据通 ...

  8. JSON与XML优缺点对比分析

    本文从各个方面向大家对比展示了json和xml的优缺点,十分的全面细致,有需要的小伙伴可以参考下. 1. 定义介绍 1.1 XML定义 扩展标记语言 (Extensible Markup Langua ...

  9. php生成json或者xml数据

    , ,'数据返回成功',$arr);echo $xml;?>

随机推荐

  1. JSP 内置对象的四种属性范围

    在jsp页面中的对象,包括用户创建的对象(例如,javaBean对象)和JSP的隐含对象,都有一个范围属性.范围定义了在什么时间内,在哪一个JSP页面中可以访问这些对象.例如,session对象在会话 ...

  2. 分分钟解决iOS开发中App启动广告的功能

    前不久有朋友需要一个启动广告的功能,我说网上有挺多的,他说,看的不是很理想.想让我写一个,于是乎,抽空写了一个,代码通俗易懂,简单的封装了一下,各种事件用block回调的,有俩种样式的广告,一种是全屏 ...

  3. Oracle学习----集群因子(Clustering Factor)

    1.集群因子的算法: 通过dbms_rowid.rowid_block_number(rowid)找到记录对应的block 号.索引中记录了rowid,因此oracle 就可以根据索引中的rowid来 ...

  4. Android(java)学习笔记175:BroadcastReceiver之 外拨电话的广播接收者

    首先我们示例工程一览表如下: 1.首先我们还是买一个收音机,定义一个OutCallReceiver继承自BroadcastReceiver,onReceive()方法中定义了监听到广播,要执行的操作: ...

  5. Hibernate占位符警告:use named parameters or JPA-style positional parameters instead.

    Hibernate占位符警告:use named parameters or JPA-style positional parameters instead. >>>>> ...

  6. 【锋利的jQuery】学习笔记02

    第二章 jQuery选择器 一.jQuery选择器的优势 写法简洁 $("div") 支持css2和css3选择器(对于css3选择器支持这一项,我认为应该是jQuery首先创造并 ...

  7. html 之前学习响应式的笔记

    响应式的设计,根据用户设备的不同,用户屏幕大小不同,提供不同的网页设计http://mediaqueri.es/PhoneGap 使用2,如何模拟手机设备chome 浏览器 在32以上设备检测用 de ...

  8. PHP获得header头进行分析

    学web的人都知道,要深刻的理解就一定要对HTTP协议有深刻的理解,这样你才能理解整个运行的流程,有些功能你才能理解应该 如何去实现,比如:仿盗链啊,定义IP后切换页面语种的版本啊,等等, 这里就来对 ...

  9. WisDom.Net 框架设计(八) 持久层

    WisDom.Net ---持久层  1.什么是持久层        持久层负责最基础的功能支撑,为项目提供一个高层,统一,和并发的数据持久机制,提供了比如建立数据库连接,关闭数据库连接,执行sql语 ...

  10. Java随机生成定长纯数字或数字字母混合数

    (转)Java随机生成定长纯数字或数字字母混合数 运行效果图: 具体实现代码