为什么这个 JSON 无效?

oom*_*pah 3 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>"})
Run Code Online (Sandbox Code Playgroud)

顺便说一句,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); }
});
Run Code Online (Sandbox Code Playgroud)

use*_*716 7

此时回答可能毫无用处,但我只是想我会注意到这个问题似乎与$.parseJSON().

如果我删除所有出现的\n,并将所有出现的 替换\"\',则它可以工作。

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

\\n
\\"
Run Code Online (Sandbox Code Playgroud)

...这是有道理的,因为我相信 jQuery 只是做了一个eval()(或者实际上是相同的事情),所以我猜转义是"终止字符串,而转义是\n引入一个换行符,它将是无效的。