JSON与XML优缺点对比分析


Posted in Javascript onJuly 17, 2015

1. 定义介绍

1.1 XML定义

扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

1.2 JSON定义

JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的行为。这些特性使JSON成为理想的数据交换语言。
JSON基于JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。

2. XML和JSON优缺点

2.1 XML的优缺点

XML的优点

A.格式统一,符合标准;

B.容易与其他系统进行远程交互,数据共享比较方便。

XML的缺点

A.XML文件庞大,文件格式复杂,传输占带宽;

B.服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;

C.客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;

D.服务器端和客户端解析XML花费较多的资源和时间。

2.2 JSON的优缺点

JSON的优点:

A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;

B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;

C.支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;

D.在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;

E.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。

JSON的缺点

A.没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;

B.JSON格式目前在Web Service中推广还属于初级阶段。

3. XML和JSON的优缺点对比

可读性方面。

JSON和XML的数据可读性基本相同,JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,XML可读性较好些。

可扩展性方面。

XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

编码难度方面。

XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

解码难度方面。

XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。

流行度方面。

XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。

解析手段方面。

JSON和XML同样拥有丰富的解析手段。

数据体积方面。

JSON相对于XML来讲,数据的体积小,传递的速度更快些。

数据交互方面。

JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。

数据描述方面。

JSON对数据的描述性比XML较差。

传输速度方面。

JSON的速度要远远快于XML。

4.XML与JSON数据格式比较

4.1 关于轻量级和重量级

轻量级和重量级是相对来说的,那么XML相对于JSON的重量级体现在哪呢?应该体现在解析上,XML目前设计了两种解析方式:DOM和 SAX。

DOM

DOM是把一个数据交换格式XML看成一个DOM对象,需要把XML文件整个读入内存,这一点上JSON和XML的原理是一样的,但是XML要考虑父节点和子节点,这一点上JSON的解析难度要小很多,因为JSON构建于两种结构:key/value,键值对的集合;值的有序集合,可理解为数组;

SAX

SAX不需要整个读入文档就可以对解析出的内容进行处理,是一种逐步解析的方法。程序也可以随时终止解析。这样,一个大的文档就可以逐步的、一点一点的展现出来,所以SAX适合于大规模的解析。这一点,JSON目前是做不到得。
所以,JSON和XML的轻/重量级的区别在于:
JSON只提供整体解析方案,而这种方法只在解析较少的数据时才能起到良好的效果;
XML提供了对大规模数据的逐步解析方案,这种方案很适合于对大量数据的处理。

4.2 关于数据格式编码及解析难度

在编码方面。

虽然XML和JSON都有各自的编码工具,但是JSON的编码要比XML简单,即使不借助工具,也可以写出JSON代码,但要写出好的XML代码就有点困难;与XML一样,JSON也是基于文本的,且它们都使用Unicode编码,且其与数据交换格式XML一样具有

可读性。

主观上来看,JSON更为清晰且冗余更少些。JSON网站提供了对JSON语法的严格描述,只是描述较简短。从总体来看,XML比较适合于标记文档,而JSON却更适于进行数据交换处理。

在解析方面。

在普通的web应用领域,开发者经常为XML的解析伤脑筋,无论是服务器端生成或处理XML,还是客户端用 JavaScript 解析XML,都常常导致复杂的代码,极低的开发效率。
实际上,对于大多数Web应用来说,他们根本不需要复杂的XML来传输数据,XML宣称的扩展性在此就很少具有优势,许多Ajax应用甚至直接返回HTML片段来构建动态Web页面。和返回XML并解析它相比,返回HTML片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。同XML或 HTML片段相比,数据交换格式JSON 提供了更好的简单性和灵活性。在Web Serivice应用中,至少就目前来说XML仍有不可动摇的地位。

实例比较

XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。
用XML表示中国部分省市数据如下:

<?xml version="1.0" encoding="utf-8" ?>
<country>
 <name>中国</name>
 <province>
  <name>黑龙江</name>
  <citys>
   <city>哈尔滨</city>
   <city>大庆</city>
  </citys> 
 </province>
 <province>
  <name>广东</name>
  <citys>
   <city>广州</city>
   <city>深圳</city>
   <city>珠海</city>
  </citys> 

 </province>
 <province>
  <name>台湾</name>
  <citys>
    <city>台北</city>
    <city>高雄</city>
  </citys> 
 </province>
 <province>
  <name>新疆</name>
  <citys>
   <city>乌鲁木齐</city>
  </citys>
 </province>
</country>

用JSON表示中国部分省市数据如下:

var country =
    {
      name: "中国",
      provinces: [
      { name: "黑龙江", citys: { city: ["哈尔滨", "大庆"]} },
      { name: "广东", citys: { city: ["广州", "深圳", "珠海"]} },
      { name: "台湾", citys: { city: ["台北", "高雄"]} },
      { name: "新疆", citys: { city: ["乌鲁木齐"]} }
      ]
    }

编码的可读性来说,XML有明显的优势,毕竟人类的语言更贴近这样的说明结构。JSON读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读,所以通过JSON的索引country.provinces[0].name就能够读取“黑龙江”这个值。

编码的手写难度来说,XML还是舒服一些,好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是密密麻麻的有用数据,而XML却包含很多重复的标记字符。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
javascript 当前日期加(天、周、月、年)
Aug 09 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
May 28 Javascript
javascript学习笔记(十一) 正则表达式介绍
Jun 20 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
Apr 10 Javascript
javascript对下拉列表框(select)的操作实例讲解
Nov 29 Javascript
JavaScript学习笔记之数组随机排序
Mar 23 Javascript
对js中回调函数的一些看法
Aug 29 Javascript
react-router实现按需加载
May 09 Javascript
关于redux-saga中take使用方法详解
Feb 27 Javascript
深入解析ES6中的promise
Nov 08 Javascript
Vue中的基础过渡动画及实现原理解析
Dec 04 Javascript
JS自定义对象创建与简单使用方法示例
Jan 15 Javascript
浅谈jQuery的offset()方法及示例分享
Jul 17 #Javascript
JavaScript用select实现日期控件
Jul 17 #Javascript
纯javascript制作日历控件
Jul 17 #Javascript
javascript生成不重复的随机数
Jul 17 #Javascript
jQuery实现径向动画菜单效果
Jul 17 #Javascript
jquery合并表格中相同文本的相邻单元格
Jul 17 #Javascript
用svg制作富有动态的tooltip
Jul 17 #Javascript
You might like
第七节 类的静态成员 [7]
2006/10/09 PHP
PHP实现文件安全下载
2006/10/09 PHP
微信API接口大全
2015/04/15 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
Vue实现剪贴板复制功能
2019/12/31 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Django框架下在视图中使用模版的方法
2015/07/16 Python
Python中的集合类型知识讲解
2015/08/19 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
市场开发与营销专业求职信
2013/12/31 职场文书
《赶海》教学反思
2014/04/20 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
篮球比赛口号
2014/06/10 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang