How does JSON compare to XML in terms of file size and serialisation/deserialisation time?

前端 未结 8 1791
萌比男神i
萌比男神i 2020-12-28 16:43

I have an application that performs a little slow over the internet due to bandwidth reasons. I have enabled GZip which has improved download time by a significant amout, bu

相关标签:
8条回答
  • 2020-12-28 17:08

    Not an answer, but rather a suggestion to examine your assumptions.

    How is JSON smaller?

    JSON:

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

    XML:

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

    I just don't see how, in general, a JSON expression is going to be 30% smaller than "equivalent" XML. Even as you ramp up the complexity of these things, with nested structures and arrays, it's not going to be a 30% difference. It's approximately equivalent, with json earning an advantage because the end tag of a nested structure is a } , while XML earns an advantage because it need not quote field names.

    If you forced me to use XML elements, like this:

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

    ...sure, the resulting XML is larger than the prior JSON. But that seems like cheating.


    Now it may be that the way you format your XML currently uses elements for everything, and that there's an opportunity to shrink the payload accordingly. But that doesn't necessarily imply JSON. If you've got tools and libraries that handle XML, you can keep XML and shrink.

    0 讨论(0)
  • 2020-12-28 17:09

    In terms of object serialization, JSON will generally be more compact (even when compressed). For Example:

    I serialized the same instance of an object into both XML and JSON and got the following:

    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>
    

    When encoded in ASCII, the JSON is 1422 bytes while the XML is 1954 bytes. After compressing them using a GZipStream, the difference is smaller but still pretty clear. The JSON compresses down to 524 bytes while the XML compresses down to 695 bytes.

    Serialization/deserialization time will vary by implementation (and hardware of course) but I serialized and deserialized the above JSON and XML 100,000 times in a loop and got the total accumulative times:

    JSON Serialization: 5258 ms, XML Serialization: 3266 ms

    JSON Deserialization: 9582 ms, XML Deserialization: 4604 ms

    So XML serializes and deserializes faster using the libraries I'm using (see below), but with averages measuring in the hundredths of milliseconds, I'd say network bandwidth and transfer time is more consequential.

    (Note: I did this in C# using Microsoft's System.Xml.Serialization.XmlSerializer and JSON.Net's Newtonsoft.Json.JsonConvert classes)

    0 讨论(0)
提交回复
热议问题