【编者按】本文作者 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. STM32的优先级NVIC_PriorityGroupConfig的理解及其使用

    写作原由:因为之前有对stm32 优先级做过研究,但是没时间把整理的东西发表,最近项目需要2个串口,但是不是两个串口同时使用,只是随机使用其中一个,程序对2个串口的优先级需要配置: 此文思路:“中断优 ...

  2. 基于 CoreText 实现的高性能 UITableView

    引起UITableView卡顿比较常见的原因有cell的层级过多.cell中有触发离屏渲染的代码(譬如:cornerRadius.maskToBounds 同时使用).像素是否对齐.是否使用UITab ...

  3. AFNetworking 新版本3.0的迁移

    AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持.如果项目以前使用过这些API,那么我们需要升级到基于 NSURLSession 的API的AFNet ...

  4. Android(java)学习笔记195:三重for循环的优化(Java面试题)

    1.首先我们看一段代码: for(int i=0;i<1000;i++){ for(int j=0;j<100;j++){ for(int k=0;k<10;k++){ testFu ...

  5. ubuntu 14.04 编译安装 nginx

    下载源码包 nginx 地址:http://nginx.org/en/download.html  下载nginx 1.4.7 编译前先安装两个包: 直接编译安装会碰到缺少pcre等问题,这时候只要到 ...

  6. spring 3.1.4 升 4.0.2

          来自为知笔记(Wiz)

  7. 锱铢必较,从(function(){}())与(function(){})()说起

    今天做JsHint时,碰到一个警告:应该使用(function(){}())而不是(function(){})();看到这个我心想,这两种函数自执行有什么区别吗?自执行用了这么久,感觉对其理解仍然有点 ...

  8. 无法加载协定为“ServiceReference1.ReportWsSoap”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。

    前言 引用websevice时,有时会出现如下错误: 异常详细信息: System.InvalidOperationException: 无法加载协定为“ServiceReference1.Repor ...

  9. raw socket遇上windows

    最近很长一段时间内又捡起了大学时丢下的网络协议,开始回顾网络协议编程,于是linux系统成了首选,它让我感到了无比的自由,可以很通透的游走于协议的各层. 最初写了个ARP欺骗程序,很成功的欺骗了win ...

  10. 『重构--改善既有代码的设计』读书笔记----Change Value to Reference

    有时候你会认为某个对象应该是去全局唯一的,这就是引用(Reference)的概念.它代表当你在某个地点对他进行修改之后,那么所有共享他的对象都应该在再次访问他的时候得到相应的修改.而不会像值对象(Va ...