由于带宽原因,我的应用程序在互联网上执行速度有点慢。我已经启用了GZip,它提高了下载时间,但我还在考虑是否可以从XML切换到JSON以便挤出最后一点性能。使用JSON会使邮件大小显着缩小,还是会略小一些?假设我们正在谈论250kB的XML数据(压缩到30kB)。
答案 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“更快”,但两者之间的差异变得更加微妙。
我观察到的是什么;
一般来说,每当我听到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)
答案 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年文章,请注意]