Как JSON сравнивается с XML с точки зрения размера файла и времени сериализации / десериализации? - PullRequest
23 голосов
/ 20 апреля 2010

У меня есть приложение, которое работает немного медленно по Интернету из-за пропускной способности.Я включил GZip, который значительно увеличил время загрузки, но я также думал о том, могу ли я перейти с XML на JSON, чтобы выжать этот последний бит производительности.С помощью JSON размер сообщения значительно уменьшится или будет несколько меньше?Допустим, мы говорим о 250 КБ данных XML (которые сжимаются до 30 КБ).

Ответы [ 8 ]

18 голосов
/ 07 июня 2016

С точки зрения сериализации объектов 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 100 000 раз в цикле и получил общее время накопления:

Сериализация JSON: 5258 мс, Сериализация XML: 3266 мс

десериализация JSON: 9582 мс, Десериализация XML: 4604 мс

Таким образом, XML сериализуется и десериализуется быстрее с использованием библиотек, которые я использую (см. Ниже), но со средними значениями, измеряемыми в сотых долях миллисекунд, я бы сказал, что пропускная способность сети и время передачи более важны.

(Примечание. Я сделал это в C # с использованием классов Microsoft System.Xml.Serialization.XmlSerializer и JSON.Net Newtonsoft.Json.JsonConvert)

14 голосов
/ 20 апреля 2010

Не ответ, а скорее предложение проверить ваши предположения.

Чем меньше JSON?

JSON:

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

XML:

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

Я просто не понимаю, как в общем случае выражение JSON будет на 30% меньше, чем "эквивалентный" XML. Даже если вы увеличите сложность этих вещей с помощью вложенных структур и массивов, разница не составит 30%. Это примерно эквивалентно, поскольку json получает преимущество, потому что конечный тег вложенной структуры - это}, в то время как XML получает преимущество, потому что ему не нужно заключать в кавычки имена полей.

Если вы заставили меня использовать элементы XML, например:

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

... конечно, результирующий XML больше, чем предыдущий JSON. Но это похоже на обман.


Теперь может случиться так, что при форматировании вашего XML в настоящее время используются элементы для всего, и есть возможность соответственно уменьшить полезную нагрузку. Но это не обязательно подразумевает JSON. Если у вас есть инструменты и библиотеки, которые обрабатывают XML, вы можете сохранить XML и уменьшить его.

10 голосов
/ 28 марта 2013

на самом деле на это сложнее ответить, чем кажется,

Несколько лет назад json был «быстрее», но различия между ними стали тоньше.

что я наблюдал это;

  • xml сжимает лучше с помощью gzip, чем json .. сэкономленное время при загрузке может компенсировать другие компоненты
  • парсинг / запросы xml в необработанных js примерно эквивалентны json
  • Анализ XML / запросов в jquery намного медленнее ... Я не буду жалеть разработчиков jquery сосредоточиться на json

В целом технология, ускоряющая работу современных браузеров, также применима и к обработке XML.

В общем, всякий раз, когда я слышу, что json рекламируется как «обезжиренная» альтернатива XML, я задаюсь вопросом, не является ли это какой-то подсознательной навязчивой идеей в вопросах веса ... это в мои пессимистичные дни;

В общем, я следую большому правилу:

разметка хороша для документов JSON хорошо для данных

и двигаться дальше ... здесь нечего видеть

2 голосов
/ 22 апреля 2010

Лучший способ ответить на этот вопрос - протестировать его самостоятельно, так как сжатие включено. Вы также аккуратно избегаете священной войны XML против JSON, имея объективный ответ!

Поскольку это всего лишь тест, который на самом деле не нуждается в работе, вы можете просто написать конвертер xml-> json в javascript, который прошел по дереву XML DOM и скопировал его во вложенную структуру массива / объекта, а затем передал его JSON.stringify (). Единственный сложный момент - решить, что станет массивом, а что - объектом.

Найдите репрезентативную выборку (или несколько) отправляемых данных, преобразуйте их в JSON с помощью своего инструмента, скопируйте и оригинальный XML и сравните размеры.

Примечание: я искал онлайновый конвертер XML-> JSON, и все они были ужасны - пробел копий за пределами кавычек (недопустимый в JSON, изменяет размер) и имен ключей без кавычек (то же самое). Не используйте их для теста, иначе вы получите неверные данные.

1 голос
/ 20 апреля 2010

Вообще говоря, JSON намного быстрее и меньше, чем эквивалентный XML. XML более богат тем, что вы можете хранить метаданные (атрибуты) и контент отдельно, но того же можно достичь в JSON с помощью соответствующих соглашений о структурировании.

0 голосов
/ 27 ноября 2016

Существуют различные способы представления JSON, например BSON и CBOR , которые уменьшают его размер.

0 голосов
/ 06 февраля 2013
<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.

Но не следует говорить, что более тонкая разновидность XML на 13% не так справедлива. И поэтому он даже превосходит JSON (по размеру).

[1]: http://www.ibm.com/developerworks/xml/library/x-eleatt/index.html [статья 2004 года, заметьте]

0 голосов
/ 20 апреля 2010

Да, JSON будет примерно на 30% быстрее, по строке будет проходить меньше символов, и анализ будет очень быстрым.

Ypu также может взглянуть на «YAML», который отправляет в сообщении абсолютный минимум метаданных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...