• XML和JSON数据格式对比


    概念

    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,解析效率是xml484倍,查找效率是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>
  • 相关阅读:
    centos python sh recode command not find的解决办法
    Webmail邮件攻防实战技术总结[转]
    关于c#字符串三种逆转方法及性能比较的另外看法
    随机生成10个含有1万个qq邮箱的文件(Python)
    C#对IE使用Proxy(代理)
    sohu邮箱的联系人获取
    Python 的二进制文件读写需要注意的地方
    hotmail解码遇到的&#解码问题
    利用cookie收取Hotmail信件
    CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\web\4b49f661\23a749fc\App_Web_default.aspx.cdcab7d2.zii77dc.dll
  • 原文地址:https://www.cnblogs.com/lightsong/p/6230280.html
Copyright © 2020-2023  润新知