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

Nic*_*ton 23 xml json

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

Mil*_* B. 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
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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


Che*_*eso 14

不是答案,而是建议检查你的假设.

JSON如何变小?

JSON:

"person":{"firstname":"Fred", 
          "lastname":"Flintstone",  
          "age":38, 
          "spouse":"Wilma" }
Run Code Online (Sandbox Code Playgroud)

XML:

<person firstname='Fred' 
        lastname='Flintstone' 
        age='38' 
        spouse='Wilma'/>
Run Code Online (Sandbox Code Playgroud)

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

如果你强迫我使用XML元素,如下所示:

<person>
   <firstname>Fred<firstname>
   <lastname>Flintstone<lastname>
   <age>38</age>
   <spouse>Wilma</spouse>
</person>
Run Code Online (Sandbox Code Playgroud)

...确定,生成的XML比以前的JSON大.但这似乎是在作弊.


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

  • 使用内容属性是作弊.这违反了XML设计的既定[原理](http://www.ibm.com/developerworks/xml/library/x-eleatt.html). (61认同)
  • 做得好吗?引用该文章的摘要:*与大多数设计问题一样,这个问题很少有绝对答案*.并且,*在本文中,Uche Ogbuji提供了一系列指导原则,用于放置元素和属性中的内容.*您是否声称Uche Ogbuji的建议具有"完善原则"的重要性?我不同意.我不同意以与JSON相同的方式使用XML在某种程度上是不可接受或令人困惑的. (7认同)
  • 属性很好,直到您需要子元素,这会影响xslt/xpath,可能是一个大的(或小的)更改,取决于转换逻辑的范围,要小心. (7认同)
  • 您的方法仅适用于平面数据.一旦开始格式化嵌套数据,就无法选择嵌套标签. (6认同)
  • 单个元素的人为设计示例并未演示真实场景.只要你有人名单,分歧就会变大.此外,XML文档通常必须具有根元素和标题. (5认同)
  • "使用内容的属性是作弊" - 1)祈祷告诉我们如何形成良好的XML"欺骗"?如果它没有欺骗(非常长的)规范,那么就克服它.2)所以ASP.NET web.config在其他一千个大狗的例子中作弊.<forms loginUrl ="〜/ Dash/Login"defaultUrl ="〜/ Dash"timeout ="2880"requireSSL ="false"slidingExpiration ="true"/> (2认同)
  • 最近的分析表明 xml 和 json 之间的速度差异比大多数人意识到的要小得多 http://www.balisage.net/Proceedings/vol10/html/Lee01/BalisageVol10-Lee01.html (2认同)

Jim*_*ler 10

实际上,这似乎很难回答,

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

我观察到的是;

  • xml压缩得更好用gzip然后json ..下载时保存的时间可以抵消其他组件
  • 原始js中的xml解析/查询与json大致相同
  • XML解析/ jQuery中查询慢得多......我不会吝惜jQuery的开发人员专注于JSON

总体而言,加速现代浏览器的技术也适用于xml处理.

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

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

标记适用于文件json有利于数据

继续前进......没有什么可看的

  • JSON适用于数据,XML非常适合文档.理所当然,XML压缩效果更好,冗余信息更多. (2认同)