概念
XML
扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
http://www.cnblogs.com/SanMaoSpace/p/3139186.html
XML规范:
https://www.w3.org/TR/REC-xml/
例子.
XML数据格式样例:
<employees> <employee> <firstName>Bill</firstName> <lastName>Gates</lastName> </employee> <employee> <firstName>George</firstName> <lastName>Bush</lastName> </employee> <employee> <firstName>Thomas</firstName> <lastName>Thomas</lastName> </employee> </employees>
JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式。同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包。
http://www.cnblogs.com/worfdream/articles/1956449.html
JSON规范:
http://json.org/
例子.
JSON数据格式样例:
{ "employees": [ { "firstName": "Bill", "lastName": "Gates" }, { "firstName": "George", "lastName": "Bush" }, { "firstName": "Thomas", "lastName": "Carter" } ] }
对比
效率实验对比
以概念章节中JSON的例子数据为研究对象, 构造同等的XML数据:
以这两个数据考察,它们分别在相同浏览器中的解析时间,和 查询时间:
在firefox浏览器中:
1、 解析1000次;
2、 查询第二个员工lastName,10000次。
针对两个数据分别构造页面脚本,分别跑5次,实验结果如下:
XML
项目 次数 | 1 | 2 | 3 | 4 | 5 | 平均 |
解析 | 1646 | 1656 | 1608 | 1650 | 1661 | 1644.2 |
查找 | 10 | 10 | 10 | 11 | 11 | 10.4 |
单位(ms)
JSON
项目 次数 | 1 | 2 | 3 | 4 | 5 | 平均 |
解析 | 4 | 4 | 3 | 3 | 3 | 3.4 |
查找 | 1 | 1 | 1 | 1 | 0 | 0.8 |
单位(ms)
总结,JSON的效率远远高于xml,解析效率是xml的484倍,查找效率是13倍。
数据量对比
调查对于同一份数据信息,使用XML描述和JSON描述数据量差别对比。
以效率实验中的数据为对象,统计结果:XML是JSON的1.71倍。
XML: 263Byte
JSON: 154Byte
JSON对于相同信息的描述,比XML更加省数据量,比XML省42%,传输更快。
特性对比
| XML | JSON |
可读性 | 高 | 高 |
可扩展性 | 高 | 高 |
编写容易度 | 中 | 高 |
查找容易度 | 低 | 高 |
流行度 | 高 | 中 |
数据描述能力 | 高 | 中 |
安全性 | 高 | 中 |
说明:
1、 关于流行度,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。
2、 关于安全性,由于大部分Javascript库都是使用eval()来解析数据,存在执行恶意JSON数据的安全漏洞;当然可以使用专门的JSON解析器来避免这个问题。相比,XML更安全一些。
参考:
https://blog.tanteng.me/2012/09/json-xml-compare/
http://www.cnblogs.com/SanMaoSpace/p/3139186.html
综上所述,XML由于其诞生时间早,相对成熟,在流行度、数据描述能力、安全性相对较高,其它特性JSON较高或者相同。其中编写和查询容易度,关系到开发体验,能提高开发效率,JSON优于XML。
效率实验
json
<!doctype html> <html> <head> </head> <body> <script type="text/javascript"> function hereDoc(f){ return f.toString().replace(/^[^\/]+\/\*!?\s?/, '').replace(/\*\/[^\/]+$/, ''); } var jsonstring = hereDoc(function(){/* { "employees": [ { "firstName": "Bill", "lastName": "Gates" }, { "firstName": "George", "lastName": "Bush" }, { "firstName": "Thomas", "lastName": "Carter" } ] } */}); // 统计解析耗时 var starttime = (new Date()).getTime(); for (var i = 0; i < 1000; i++) { JSON.parse(jsonstring); }; var endtime = (new Date()).getTime(); console.log("parsing consume time ="+(endtime - starttime)) // 查询第二个成员lastName var starttime = (new Date()).getTime(); var jsonObj = JSON.parse(jsonstring); //console.log("lastName = "+lastName) for (var i = 0; i < 10000; i++) { var lastName = jsonObj.employees[1].lastName }; var endtime = (new Date()).getTime(); console.log("finding consume time ="+(endtime - starttime)) </script> </body> </html>
xml
<!doctype html> <html> <head> </head> <body> <script type="text/javascript"> function hereDoc(f){ return f.toString().replace(/^[^\/]+\/\*!?\s?/, '').replace(/\*\/[^\/]+$/, ''); } function GetXMLParseFunc() { if (window.DOMParser) { var parser=new DOMParser(); return function (xmlstring) { return parser.parseFromString(xmlstring,"text/xml"); } } else // Internet Explorer { console.log("not support DOMParser"); // xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); // xmlDoc.async="false"; // xmlDoc.loadXML(txt); } } var xmlstring = hereDoc(function(){/* <employees> <employee> <firstName>Bill</firstName> <lastName>Gates</lastName> </employee> <employee> <firstName>George</firstName> <lastName>Bush</lastName> </employee> <employee> <firstName>Thomas</firstName> <lastName>Thomas</lastName> </employee> </employees> */}); var parseFunc = GetXMLParseFunc(); // 统计解析耗时 var starttime = (new Date()).getTime(); for (var i = 0; i < 1000; i++) { parseFunc(xmlstring); }; var endtime = (new Date()).getTime(); console.log("parsing consume time ="+(endtime - starttime)) // 查询第二个成员lastName var starttime = (new Date()).getTime(); var xmlObj = parseFunc(xmlstring); for (var i = 0; i < 10000; i++) { var lastName = xmlObj.getElementsByTagName("employee")[1].getElementsByTagName("lastName")[0].childNodes[0].nodeValue //console.log("lastName = "+lastName) }; var endtime = (new Date()).getTime(); console.log("finding consume time ="+(endtime - starttime)) </script> </body> </html>