Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在文件大小和序列化/反序列化时间方面,JSON与XML相比如何?_Xml_Json - Fatal编程技术网

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

在文件大小和序列化/反序列化时间方面,JSON与XML相比如何?,xml,json,Xml,Json,我有一个应用程序,由于带宽的原因,在互联网上执行有点慢。我启用了GZip,这大大缩短了下载时间,但我也在考虑是否可以从XML切换到JSON,以挤出最后一点性能。使用JSON会使消息的大小大大减小,还是只是稍微小一点?假设我们讨论的是250kB的XML数据(压缩到30kB)。是的,JSON将快30%左右,行中的字符更少,解析速度非常快 Ypu还可以看看“YAML”,它在消息中发送的元数据绝对最少。一般来说,JSON比等效的XML快得多,也小得多。XML更丰富,因为您可以分别存储元数据(属性)和内容

我有一个应用程序,由于带宽的原因,在互联网上执行有点慢。我启用了GZip,这大大缩短了下载时间,但我也在考虑是否可以从XML切换到JSON,以挤出最后一点性能。使用JSON会使消息的大小大大减小,还是只是稍微小一点?假设我们讨论的是250kB的XML数据(压缩到30kB)。

是的,JSON将快30%左右,行中的字符更少,解析速度非常快


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

一般来说,JSON比等效的XML快得多,也小得多。XML更丰富,因为您可以分别存储元数据(属性)和内容,但同样可以通过适当的结构化约定在JSON中实现。

这不是一个答案,而是一个检查假设的建议

JSON有多小

JSON:

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>

弗莱德
燧石
38
威尔玛
…当然,生成的XML比以前的JSON要大。但这似乎是作弊



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

回答这个问题的最好方法是自己测试,因为这涉及到压缩。通过客观的回答,您还可以巧妙地避免XML与JSON之间的圣战

因为这只是一个测试,并不需要真正工作,所以您可以用javascript编写一个xml->json转换器,它遍历xml DOM树并将其复制到嵌套的数组/对象结构中,然后将其传递给json.stringify()。唯一棘手的是决定什么成为数组,什么成为对象

找到所发送数据的代表性示例(或一些示例),使用工具将其转换为JSON,gzip it和原始XML,并比较大小

注意:我到处寻找一个在线的XML->JSON转换器,它们都很糟糕——引号外的空白(在JSON中是非法的,可以改变大小)和不带引号的键名(同上)。不要在测试中使用它们,否则会得到错误的数据。


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

"person":{"firstname":"Fred", 
          "lastname":"Flintstone",  
          "age":38, 
          "spouse":"Wilma" }
“人”:{“名字”:“弗雷德”, “姓氏”:“燧石”, “年龄”:38岁, “配偶”:“威尔玛”}
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] :[2004年文章,请注意]

事实上,这个问题似乎很难回答

几年前,json是“更快”的,但两者之间的差异变得更细微了

我所观察到的是

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

一般来说,每当我听到json被吹捧为XML的“低脂”替代品时,我想知道这是否是对重量问题的潜意识困扰。。。那是在我悲观的日子里

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

适合文档的标记 json对数据有好处


然后继续。。。这里没有什么可看的

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

我将同一个对象实例序列化为XML和JSON,得到以下结果:

JSON

XML


2222
124235
9652358474
0
为了卡车
手机
权限最小化
达斯公司
565555555
222224455116
32
波特贝洛路西555号
伦敦
得克萨斯州
45217
权限最小化
1111222233334444
546
10
2018
波特贝洛路西555号
伦敦
得克萨斯州
45217
0
权限最小化
波特贝洛路西555号
伦敦
得克萨斯州
45217
25
5.
10
1.5
35
1442-4521
0
2.
72.95
地面
1212-5549
0
1.
31.15
地面
当以ASCII编码时,JSON是1422字节,而XML是1954字节。在使用gzip压缩它们之后
<forms loginUrl="~/Home/Login" 
       defaultUrl="~/Home" 
       timeout="2880" 
       requireSSL="false" 
       slidingExpiration="true" />
{
    "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 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>