为什么这个JSON无效?

时间:2011-02-19 16:35:42

标签: jquery json

我将一些数据从服务器发送回页面。它对我来说看起来像是有效的JSON,但它正在我的jQuery.ajax()调用中被错误处理程序捕获/处理。

这是显示的错误消息:

Error: Invalid JSON: ({"id":"#settingsResult","payload":"<form id=\"pwd_change_frm\" action=\"post\">\n    <div>\n        <div>\n            <div><\/div>\n            <div><label for=\"changepwd_password\">New Password<\/label><\/div>\n            <div><input type=\"password\" name=\"changepwd[password]\" title=\"Enter new password\" style=\"width:258px;\" id=\"changepwd_password\" \/><\/div>\n        <\/div>\n        <div class=\"spacer\">&nbsp;<\/div>\n        <div>\n            <div><\/div>\n            <div><label for=\"changepwd_password_confirm\">Confirm New Password<\/label><\/div>\n            <div><input type=\"password\" name=\"changepwd[password_confirm]\" title=\"Retype new password)\" style=\"width:258px;\" id=\"changepwd_password_confirm\" \/><\/div>\n        <\/div>\n        <div class=\"spacer\"><\/div>\n        <div><img id=\"pwd_chg_btn\" class=\"submit_btn\" src=\"\/images\/button_submit.gif\" alt=\"Button_submit\" \/><\/div>\n    <\/div>\n    <input type=\"hidden\" name=\"changepwd[_csrf_token]\" value=\"1b7f3529797245c0fc43c3ddf5ade30d\" id=\"changepwd__csrf_token\" \/><\/form>\n<div class=\"spacer\"><\/div>"})

另外,FF Firebug正确解析返回的数据并正确显示 - 这就是为什么我不明白为什么jQuery似乎无法处理它。

这是进行调用的代码:

jQuery.ajax({
  type: 'POST',
  url: '/some_url?id='+this.id,
  timeout: 2000,
  success: function(result){ jQuery(result.id).html(result.payload); },
  error: function (xhr, ajaxOptions, thrownError){ alert('Error: '+ thrownError); }
});

7 个答案:

答案 0 :(得分:4)

此时可能无用回答,但我只是觉得我注意到这个问题似乎与$.parseJSON()有关。

如果我删除所有出现的\n,并将所有\"替换为\',则会有效。

或者,如果我双重逃避它们,它就会起作用。

\\n
\\"

...这是有意义的,因为我相信jQuery只是做eval()(或实际上是相同的事情),所以我想逃避"正在终止字符串并转义{{1引入一个无效的换行符。

答案 1 :(得分:3)

由于周围的'()',删除它及其有效的json。

答案 2 :(得分:1)

由于其他所有内容似乎都有效,因此您可能会在数据中加入()

答案 3 :(得分:1)

使用jquery validate(版本1.7)时也会出现错误。您可以查看:http://datatables.net/forums/comments.php?DiscussionID=3993&page=1#Item_16

我也升级到jquery 1.5.1,我遇到了同样的问题。在我更新了jquery validate之后(从这里:https://github.com/jzaefferer/jquery-validation),错误消失了。

答案 4 :(得分:0)

传递的实际JSON是什么?错误消息中的字符串:

{"id":"#settingsResult",
 "payload":"\n \n \n <\/div>\n New Password<\/label><\/div>\n <\/div>\n <\/div>\n  <\/div>\n \n <\/div>\n Confirm New Password<\/label><\/div>\n <\/div>\n <\/div>\n <\/div>\n <\/div>\n <\/div>\n <\/form>\n<\/div>"}

根据JSONLint有效。你是否包括parens?

更改问题后更新

<\/div>是否有可能让人感到困惑?这不是有效的HTML,因此我不知道jQuery(result.id).html(result.payload)将使用它做什么。

答案 5 :(得分:0)

jquery要求您提供“dataType:json”,除非您在服务器端代码中提供正确的内容类型,例如“header('Content-type:application / json');”

答案 6 :(得分:-1)

根据json.org

  

JSON可以是数组或对象

     

对象是一组无序的名称/值对。一个对象开始   用{(左括号),以}结尾

     

object structure

     

数组是有序的值集合。数组以[以[开头]   (左括号)并以]结尾

     

array structure

所以JSON应该从&#39; {&#39;或者&#39; [&#39;并且它不能以&#39;(&#39;

)开头

此外,您还可以使用以下在线验证程序(如debugjson.com)来检查JSON输入的错误。