tags:

views:

186

answers:

4

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, but I was also considering whether or not I could switch from XML to JSON in order to squeeze out that last bit of performance. Would using JSON make the message size significantly smaller, or just somewhat smaller? Let's say we're talking about 250kB of XML data (which compresses to 30kB).

A: 

Yes JSON would be about 30% faster there are fewer characters going over the line and its very quick to parse.

Ypu could also take a look at "YAML" which sends an absolute mininmum of metadata in the message.

James Anderson
Do you have a source for the 30% figure?
Marcelo Cantos
The 30% is just my personal perceived experience.You can write more compact exml using atributes rather than tags but XML tends twards a "longer is better" way of thinking and compact XML will look "wrong" to any xml guru.Also because JSON is pretty much JavaScript its pretty easy write an efficient parser in JavaScript ( something more than "eval" which works on most JSON!) and frameworks like DOJO have excellent JSON parsers.
James Anderson
The reason why XML seems to favour elements over attributes is the fact that you can control elements and their contents far better than you can control attributes and their contents. My source is personal experience with WXS, though I have a feeling that RNG would disprove that idea. It's all a matter of personal experience. Generally though, XML looks better with elements than with attributes, and elements are a requirement in some cases (unless you want attributes like "person-1", "person-2", ..., "person-N"). That means that similar JSON (they can't always be equivalent) is smaller.
Dustin
I hate to play devil's advocate, but 30% does sound like a made up figure! ;-)
nbolton
A: 

Generally speaking, JSON is much faster and smaller than the equivalent XML. XML is richer in that you can store metadata (attributes) and content separately, but the same can be achieved in JSON with appropriate structuring conventions.

Marcelo Cantos
I don't agree with this general statement. I can write an equivalent XML doc that is more compact than JSON, if I confine myself to using attributes. If I use more of the power of XML, as you said, using both attributes and elements, the XML document will become larger than the original JSON document, but it also holds the potential to convey more meaning. It's wrong to flatly state, "JSON is smaller". It isn't. Common use of JSON is smaller than common use of XML (where everything is an element), but the common use is not required.
Cheeso
@Cheeso: Firstly, common use is the only thing that counts in the real world. Secondly, I suspect that only way to make XML smaller is to violate recommended practice such as not using attributes to store content. See [here](http://www.ibm.com/developerworks/xml/library/x-eleatt.html) for an exposition of some of the principles of XML design, with authoritative supporting references; note how verbose the final example is. An equivalent JSON might be: `{"menu":[{"portion":[250,"mL"], "name":"Small soft drink"}, {"portion":[500,"g"], "name":"Sirloin steak"}]}`.
Marcelo Cantos
@Marcelo, regarding common use, I don't agree with your viewpoint. How other people format their XML has no bearing on whether I can or should use it in server-to-browser communication in *my* app. Aso, regarding the article, it's fine to make recommendations, but what weight do they hold in this particular case? Why follow them? As I said in my full answer, if you force the XML to be verbose, it will be verbose. If you allow yourself to use the more succint XML usage, then it will be comparable with JSON in length.
Cheeso
@Cheeso, On common use: When someone sends you a SOAP packet, you can't say, "Can I have all attributes, please?" If you live on an island, by all means do whatever you want, but that's not what XML is about. On the article: Getting from A to B is much quicker at double the speed limit. XML design guidelines aren't plucked from thin air; the authors hope to steer you clear of blind alleys. You can disagree, just don't argue that your XML is succinct because you ignore good advice. Also, my JSON example has the same structure as in the article. You can only shrink the XML by hiding structure.
Marcelo Cantos
You are correct, if someone else picks the data format, I can't ask them to change it. But that's not what the original question was about. In the orig question, the asker was choosing the data format. Regarding the "hiding structure" side effect of shrinking XML, you are correct. But you fail to mention that JSON lacks that structure; the shrunken XML duplicates the structure of a JSON representation. As for "that's not what XML is about"... I have no idea what that means. You seem to want to argue strongly against the idea that XML is of comparable size to JSON. Not sure why.
Cheeso
@Marcelo: where is the evidence that backs up the "much" faster and smaller aspect of your answer?
vtd-xml-author
@Cheeso, please don't attribute motivations to my arguments. I believe something contrary to you, and I try to make my case; you are doing exactly the the same. You are stepping dangerously close to _ad hominem_, which would not be in the spirit of SO.
Marcelo Cantos
@vtd-xml-author, The "much" smaller is obvious in my example which has half as much line noise as the XML example it is based on. I don't have data on the speed, but a full-blown XML parser has far more work to do than a JSON parser, so I would be very surprised if they were close to each other in performance.
Marcelo Cantos
Marcelo, re-read all of my comments and you will see that there is no attack on you, or on anyone. I remarked that you seem to be arguing pretty strongly, but yet without a good foundation. You say things like "that's not what XML is about" and "common use is the only thing that matters in the real world". These are not technical arguments. To me, this is evidence of reaching, and I pointed it out. The size equivalence of JSON and XML is staring you in the face, and somehow you keep asserting that XML is larger. It just isn't, no matter how many times you repeat the assertion.
Cheeso
also, Marcelo, I find your other points to lack relevance. As you point out, I cannot ask a SOAP server to reformat its response. But that is absolutely irrelevant to the question at hand, which is - *is JSON smaller than XML?* It is also irrelevant that an XML document that uses attributes rather than elements sacrifices structure and the potential to carry extra meaning. JSON also lacks this. When comparing XML to JSON, why compare XML-with-elements to XML-with-attributes? Your inability to address these issues is why I remarked that you seem to have a desire to argue despite the facts.
Cheeso
You assert that XML is no bigger than JSON. I assert that this can only be so if you ignore well-established XML schema design principles (not just by the one blogger, but also by the references he cites and plenty of other materials I've read over the years). Interpreting my disagreement as "reaching" is misguided at best, disingenuous at worst. This debate is going around in circles, so feel free to have the last word. I'm done.
Marcelo Cantos
If I may chime in... I belive that Marcelo's viewpoint is possibly leaning toward dogmatic. I feel as if I would lend preference to Cheeso's opinion because it sounds like it might be based on professional experience rather than theoretical research. I'm guessing that Cheeso did not respond to Marcelo's last comment because his forehead was getting sore.
nbolton
+2  A: 

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.

Cheeso
Using attributes for content is cheating. This violates well-established [principles](http://www.ibm.com/developerworks/xml/library/x-eleatt.html) of XML design.
Marcelo Cantos
Well established? To quote from the summary of that article: *As with most design issues, this question rarely has absolute answers*. And, *In this article, Uche Ogbuji offers a set of guiding principles for what to put in elements and what to put in attributes.* Are you claiming that Uche Ogbuji's recommendations hold the weight of "well established principles"? I don't agree. And I don't agree that using XML in the same way as JSON is somehow unacceptable or confusing.
Cheeso
Marcelo Cantos, I'm not sure there's much wrong with using attributes, unless you can explain why exactly. For example, if Auto is used with SQL-XML, then the more condensed attribute style is used (to reduce network overhead, I assume).
nbolton
A: 

The best way to answer this is to test it yourself, since compression is involved. You also neatly avoid the XML vs JSON holy war by having an objective answer!

Since it's just a test and doesn't really need to work, you could just write up an xml->json converter in javascript that walked the XML DOM tree and copied it into a nested array/object structure then passed it to JSON.stringify(). The only tricky bit would be deciding what becomes an array and what becomes an object.

Find a representative sample (or a few) of the data being sent, convert it to JSON with your tool, gzip it and the original XML and compare sizes.

Note: I looked around for an online XML->JSON converter and they were all terrible--copius whitespace outside of quotes (illegal in JSON, alters size) and unquoted key names (ditto). Don't use them for your test or you'll get bad data.

BCoates
I wasn't aware that there was an XML vs JSON holy war.
nbolton