在文件大小和序列化/反序列化时间方面,JSON与XML相比如何?

时间:2010-04-20 07:35:20

标签: xml json

由于带宽原因,我的应用程序在互联网上执行速度有点慢。我已经启用了GZip,它提高了下载时间,但我还在考虑是否可以从XML切换到JSON以便挤出最后一点性能。使用JSON会使邮件大小显着缩小,还是会略小一些?假设我们正在谈论250kB的XML数据(压缩到30kB)。

8 个答案:

答案 0 :(得分:18)

就对象序列化而言,JSON通常会更紧凑(即使在压缩时)。例如:

我将对象的同一个实例序列化为XML和JSON,并得到以下内容:

JSON

{
    "Account": "2222",
    "Login": "124235",
    "SalesId": null,
    "CustomerReference": "9652358474",
    "Status": null,
    "DropShip": 0,
    "PromoCode": null,
    "Notes": "For the truck",
    "Errors": null,
    "ReferenceId": null,
    "PaymentMethod": "CKPhone",
    "CheckPayment": {
        "Name": "Simon Riggs",
        "CompanyName": "Darth Inc",
        "AccountNumber": "565555555",
        "RoutingNumber": "222224455116",
        "CheckNumber": "32",
        "Address": {
            "Attention": null,
            "Street1": "555 W Portebello Rd",
            "Street2": null,
            "City": "London",
            "State": "Texas",
            "Zipcode": "45217",
            "Country": null,
            "ReferenceId": null,
            "GetAxType": 2
        },
        "ReferenceId": null,
        "GetAxType": 2
    },
    "CreditCardPayment": {
        "Name": "Simon Riggs",
        "CardNumber": "1111222233334444",
        "Cvv2": "546",
        "Month": 10,
        "Year": 2018,
        "Address": {
            "Attention": null,
            "Street1": "555 W Portebello Rd",
            "Street2": null,
            "City": "London",
            "State": "Texas",
            "Zipcode": "45217",
            "Country": null,
            "ReferenceId": null,
            "GetAxType": 2
        },
        "ReferenceId": "0",
        "GetAxType": 2
    },
    "ShippingAddress": {
        "Attention": "Simon Riggs",
        "Street1": "555 W Portebello Rd",
        "Street2": null,
        "City": "London",
        "State": "Texas",
        "Zipcode": "45217",
        "Country": null,
        "ReferenceId": null,
        "GetAxType": 2
    },
    "Totals": {
        "SubTotal": 25.0,
        "TotalTax": 5.0,
        "ShippingTotal": 10.0,
        "ShippingTax": 1.5,
        "GrandTotal": 35.0
    },
    "Lines": [{
        "SKU": "1442-4521",
        "LineNum": 0.0,
        "Qty": 2.0,
        "Price": 72.95,
        "ShippingClass": "Ground",
        "ReferenceId": null,
        "GetAxType": 2
    },
    {
        "SKU": "1212-5549",
        "LineNum": 0.0,
        "Qty": 1.0,
        "Price": 31.15,
        "ShippingClass": "Ground",
        "ReferenceId": null,
        "GetAxType": 2
    }],
    "GetAxType": 2
}

XML

<?xml version="1.0" encoding="utf-16"?>
<SalesOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Account>2222</Account>
  <Login>124235</Login>
  <CustomerReference>9652358474</CustomerReference>
  <DropShip>0</DropShip>
  <Notes>For the truck</Notes>
  <PaymentMethod>CKPhone</PaymentMethod>
  <CheckPayment>
    <Name>Simon Riggs</Name>
    <CompanyName>Darth Inc</CompanyName>
    <AccountNumber>565555555</AccountNumber>
    <RoutingNumber>222224455116</RoutingNumber>
    <CheckNumber>32</CheckNumber>
    <Address>
      <Street1>555 W Portebello Rd</Street1>
      <City>London</City>
      <State>Texas</State>
      <Zipcode>45217</Zipcode>
    </Address>
  </CheckPayment>
  <CreditCardPayment>
    <Name>Simon Riggs</Name>
    <CardNumber>1111222233334444</CardNumber>
    <Cvv2>546</Cvv2>
    <Month>10</Month>
    <Year>2018</Year>
    <Address>
      <Street1>555 W Portebello Rd</Street1>
      <City>London</City>
      <State>Texas</State>
      <Zipcode>45217</Zipcode>
    </Address>
    <ReferenceId>0</ReferenceId>
  </CreditCardPayment>
  <ShippingAddress>
    <Attention>Simon Riggs</Attention>
    <Street1>555 W Portebello Rd</Street1>
    <City>London</City>
    <State>Texas</State>
    <Zipcode>45217</Zipcode>
  </ShippingAddress>
  <Totals>
    <SubTotal>25</SubTotal>
    <TotalTax>5</TotalTax>
    <ShippingTotal>10</ShippingTotal>
    <ShippingTax>1.5</ShippingTax>
    <GrandTotal>35</GrandTotal>
  </Totals>
  <Lines>
    <SalesLine>
      <SKU>1442-4521</SKU>
      <LineNum>0</LineNum>
      <Qty>2</Qty>
      <Price>72.95</Price>
      <ShippingClass>Ground</ShippingClass>
    </SalesLine>
    <SalesLine>
      <SKU>1212-5549</SKU>
      <LineNum>0</LineNum>
      <Qty>1</Qty>
      <Price>31.15</Price>
      <ShippingClass>Ground</ShippingClass>
    </SalesLine>
  </Lines>
</SalesOrder>

以ASCII编码时,JSON为1422字节,而XML为1954字节。在使用GZipStream压缩它们之后,差异较小但仍然很清楚。 JSON压缩到524字节,而XML压缩到695字节。

序列化/反序列化时间因实现(当然还有硬件)而异,但我在循环中对上述JSON和XML进行了10万次序列化和反序列化,得到了总累计时间:

JSON序列化:5258毫秒, XML序列化:3266 ms

JSON反序列化:9582毫秒, XML反序列化:4604 ms

因此,XML使用我正在使用的库(见下文)更快地序列化和反序列化,但平均值以百分之一毫秒为单位,我认为网络带宽和传输时间更重要。

(注意:我使用Microsoft的System.Xml.Serialization.XmlSerializer和JSON.Net的Newtonsoft.Json.JsonConvert类在C#中完成此操作)

答案 1 :(得分:13)

不是答案,而是检查您的假设的建议。

JSON如何变小?

JSON:

"person":{"firstname":"Fred", 
          "lastname":"Flintstone",  
          "age":38, 
          "spouse":"Wilma" }

XML:

<person firstname='Fred' 
        lastname='Flintstone' 
        age='38' 
        spouse='Wilma'/>

我只是看不出JSON表达式通常比“等效”XML小30%。即使你使用嵌套结构和数组提高这些东西的复杂性,它也不会有30%的差异。它大致相当,json获得了优势,因为嵌套结构的结束标记是一个},而XML获得了优势,因为它不需要引用字段名称。

如果强迫我使用XML元素,请执行以下操作:

<person>
   <firstname>Fred<firstname>
   <lastname>Flintstone<lastname>
   <age>38</age>
   <spouse>Wilma</spouse>
</person>

...当然,生成的XML比以前的JSON大。但这似乎是在作弊。


现在可能是您格式化XML的方式当前使用了所有内容的元素,并且有机会相应地缩小有效负载。但这并不一定意味着JSON。如果您有可以处理XML的工具和库,那么您可以保留XML并缩小。

答案 2 :(得分:10)

实际上这似乎很难回答,

几年前,json“更快”,但两者之间的差异变得更加微妙。

我观察到的是什么;

  • xml使用gzip然后json压缩得更好..下载时保存的时间可以抵消其他组件
  • 原始js中的xml解析/查询与json
  • 大致相同
  • 在jquery中解析/查询xml要慢得多......我不会吝惜jquery开发人员专注于json
总的来说,加速现代浏览器的技术也适用于xml处理。

一般来说,每当我听到json被吹捧为XML的“低脂”替代品时,我想知道它是不是对于体重问题的某些潜意识的痴迷......那是在我悲观的日子里;

基本上我遵循的经验法则是

标记适用于文档 json适合数据

继续前进......这里没什么可看的

答案 3 :(得分:2)

回答此问题的最佳方法是自行测试,因为涉及压缩。你也可以通过客观的答案整齐地避免XML vs JSON圣战!

由于它只是一个测试,并不需要工作,你可以在javascript中编写一个xml-&gt; json转换器,它遍历XML DOM树并将其复制到嵌套数组/对象结构中然后传递给它到JSON.stringify()。唯一棘手的问题是决定什么变成数组,什么变成对象。

找到正在发送的数据的代表性样本(或几个),使用您的工具将其转换为JSON,gzip以及原始XML并比较大小。

注意:我环顾四周寻找一个在线XML-&gt; JSON转换器,它们都非常糟糕 - 引号之外的copius空格(JSON非法,改变大小)和不带引号的键名(同上)。不要将它们用于测试,否则会得到错误的数据。

答案 4 :(得分:1)

一般来说,JSON比同等的XML快得多,也小。 XML更丰富,您可以单独存储元数据(属性)和内容,但可以使用适当的结构约定在JSON中实现相同的目标。

答案 5 :(得分:0)

是的,JSON的速度提高了大约30%,而且线路上的字符越少,解析速度就越快。

Ypu还可以查看“YAML”,它会在消息中发送绝对最少的元数据。

答案 6 :(得分:0)

有不同的方式来表示JSON,例如BSONCBOR,这会减少它的大小。

答案 7 :(得分:-4)

<person firstname='Fred' 
        lastname='Flintstone' 
        age='38' 
        spouse='Wilma'/>

"person":{"firstname":"Fred", 
          "lastname":"Flintstone",  
          "age":38, 
          "spouse":"Wilma" }

XML:80个字符

JSON:92个字符。

XML是13%的瘦身优胜者,他会想到所有虚假声明?

[以上Cheeso拍摄的例子。请注意,回车类型会更改大小,但两者都会相同。两者中没有任何回报,比率为XML:74,JSON:86,差异为14%]

有人在此讨论中声称“使用内容属性作弊”(引用[this] [1])。

1)祈祷告诉我们如何形成良好的XML“欺骗”?如果它没有欺骗(非常长)的规格,那么让我们克服它。 有效有效

2)在这种情况下,ASP.NET web.config在其他一千个大狗示例中“作弊”。

<forms loginUrl="~/Home/Login" 
       defaultUrl="~/Home" 
       timeout="2880" 
       requireSSL="false" 
       slidingExpiration="true" />

公平地说,有些人在构建XML方面倾向于拥有臃肿的XML心态。

但不应该说13%更瘦的XML品种不仅有效。因此它甚至胜过JSON(大小)。

[1]:http://www.ibm.com/developerworks/xml/library/x-eleatt/index.html [2004年文章,请注意]