JQuery 1.4 and Malformed JSON
yehudakatz.com
yehudakatz.com
I still think it was a silly mistake to impose a 'must be enclosed in quotes' rule for JSON parsing in js.
Those quotes are just wasted extra bytes. Needless.
Yeah sure, you can argue that someone silly will use a reserved word, like {new:"hello"}. But I don't think that's a good enough reason to waste more bandwidth+time for those that know what they're doing.
In jQuery we wanted to take advantage of this new JSON.parse method for speed and security - but we couldn't have it throwing malformed JSON exceptions in some browsers but not others, so we simply equalized the field (throwing an exception in all browsers).
For instance, I get the following on Chrome, running it a few times: (Doing 100,000 parses of a small JSON string)
JSON: (1653ms) vs eval: (206ms)
Firefox the two are about even (650ms). Safari is also pretty much identical (250ms).
Surprising that the Chrome JSON parse is so much slower than eval.
Do you have any performance figures for JSON parsing?
So you have JSON.parse which is the same, if not slower (Chrome) than using eval. Having to include extra unnecessary characters costs you bandwidth, but you do get the slightly better security from JSON, although that can be done with a quick regexp beforehand.
{foo:1} should be valid dammit. It tells us exactly all we need to know, with 0 ambiguity.
just my 2c.
Firefox 3.5: eval: 549 JSON.parse: 490
Safari 4: eval: 246 JSON.parse: 215
IE 8: eval: 1438 JSON.parse: 1031
Chrome: eval: 241 JSON.parse: 656
So yeah, a bit faster in Firefox and Safari, much much faster in IE 8 (the one that matters), and oddly slower in Chrome. I'll go out on a limb and blame their lax parsing (they support malformed strings).In the end though the parsing is a distant second to the improved security: Guaranteeing that eval will never get touched in modern browsers is a huge win from a framework perspective.
It's stupid how a browser will parse just about anything.
Also, "Be conservative in what you emit, and liberal in what you accept" - Postel's Law: http://en.wikipedia.org/wiki/Robustness_principle
[edit]: I'm incorrect, some closing tags are optional, </li> being one of them. for HTML5: http://www.whatwg.org/specs/web-apps/current-work/#generate-...
I dont really agree, naunces like reserved words causing bugs are major irritations and ill happily put up with a few extra bytes to never deal with them
Please cite some numbers. JSON.parse is not faster than eval in my tests.
{foo: "bar"}
which is missing the quotes around foo so it should be: {"foo": "bar"}
Since both of those would have had the same meaning the JSON spec sensibly restricts things so that only one is valid. See http://json.org/ for the (very short and readable) spec. {"foo": "bar"}