我们知道Invalid JSON错误导致的json对象不能解析,一般都是服务器返回的json字符串的语法有错误。这种情况下,我们只需要仔细的检查一下json就可以解决问题。

下面说一下,最近在使用jquery 1.4中使用$.ajax()方法解析json对象遇到的问题。

 

Json对象是:

 [

{name:'二手房出售',infoCount:0,pageUrl:'/ershoufang'},

{name:'二手房求购',infoCount:0,pageUrl:'/qiugou'},

{name:'二手房装修',infoCount:0,pageUrl:'/esfzhuangxiu'},

{name:'二手回收',infoCount:0,pageUrl:'/huishou'},

{name:'二手摩托车',infoCount:0,pageUrl:'/motor'},

{name:'二手汽车求购',infoCount:0,pageUrl:'/ershoucheqg'},

{name:'二手汽车转让',infoCount:9,pageUrl:'/ershouche'},

{name:'二手市场',infoCount:0,pageUrl:'/ershoushichang'}

]

不知道大家有没有发现这段json对象的问题。这样的写法在js脚本和jquery 1.4之前的版本都是没有问题的。因为在1.3及更早版本中,jQuery通过javascript的eval方法来解析json对象。在1.4中,jQuery使用了更严格的方法来解析json。所有的内容都必须使用双引号。

 

这点从jQuery.parseJSON(json) 可以看出,parseJSON在文档中的解释是:

接受一个JSON字符串,返回解析后的对象。

传入一个畸形的JSON字符串会抛出一个异常。比如下面的都是畸形的JSON字符串: 
{test: 1} ( test 没有包围双引号)
{'test': 1} (使用了单引号而不是双引号)

另外,如果你什么都不传入,或者一个空字符串、null或undefined,parseJSON都会返回 null 。 

最近在看jQuery的API文档,在使用到jQuery的ajax时,如果指定了dataType为json,老是不执行success回调,而是执行了error回调函数,极度郁闷。后面改为1.2.6版本可以执行。 

  然后继续下载了几个jquery版本,如1.3.2,1.4.0的,指定dataType为json都不能执行success回调,只有小于1.3版本的才能执行success回调。 

  最后去jquery的网站找到了在线的api文档看了下,地址:http://api.jquery.com/jQuery.ajax/ ,发现dataType如下的说明 
  "json": Evaluates the response as JSON and returns a JavaScript object. In jQuery 1.4 the JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. (See json.org for more information on proper JSON formatting.) 

  原来是jquery1.4版本以后对json格式要求非常严格了,要满足json.org网站定义的格式才能执行success回调,否则都会出错,无法解析返回的json数据。说的是1.4+以上的,那为什么下载的1.3.2指定dataType为json时也不能执行success回调呢? 

  怪不得不执行,原来我返回的是{success:true,id:1} 这种不规则的字符串,不是严格的json格式,改成{"success":true,"id":"1"} 就可以正常执行success回调了。 
   
  JSON格式总结下,详细的去json.org 查看。 
  1)键名称:用双引号 括起 
  2)字符串:用使用双引号 括起 
  3)数字,布尔类型不需要 使用双引号 括起