问题描述:

I've been getting an 'Invalid JSON' after making a jQuery AJAX Request. This request code is not important, so i have chosen to omit it.

I've delved into the jQuery library and stripped out the relevant code, which is aggregated into the snippet below.

So, given that my request returns a string "{'x':'1'}", why should during the course of processing it, jQuery return "{'x':']'}" ?

//regex values stripped from jQuery 1.5.2.

var data = "{'x':'1'}";

var rvalidchars = /^[\],:{}\s]*$/;

var rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;

var rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;

var rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g;

//test the various stages of data.replace from the jQuery library

alert (data.replace(rvalidescape, "@")); // {'x':'1'}"

alert (data.replace(rvalidescape, "@").replace(rvalidtokens, "]")); //{'x':']'}"

alert (data.replace(rvalidescape, "@").replace(rvalidtokens, "]").replace(rvalidbraces, "")); //{'x':']'}"

You can see it at this JSFiddle

Moreoever, the following conversions happen:

'{x:12}' --> '{x:]}'

'{"x":"12"}' --> '{],]}'

I'm guessing someone could explain to me why the regex does this, but I'm also curious as to why jQuery does it.

Any help would be much appreciated

网友答案:

From the looks of it, jQuery is replacing anything that isn't a valid JSON token with ']'. Some things, like 'null', 'true', 'false', etc. can be inserted without quotations. In fact, numbers can, too!

Your JSON is not valid because you need to double-quote values. So either:

{"x": 1}

or

{"x": "1"}

should work. Your copied code still mangles this, but throwing it through jQuery.parseJSON() works fine for me.

网友答案:

your JSON string is malformed according to : http://api.jquery.com/jQuery.parseJSON/

you must use double quotes

相关阅读:
Top