Javascript 无法在ajax响应中解析JSON数据(包含HTML标记)
编辑 我简化了我试图用php脚本进行JSON编码的数组。php脚本中的returnArr现在只有一个键、值对,但仍然出现无效字符错误:Javascript 无法在ajax响应中解析JSON数据(包含HTML标记),javascript,json,ajax,Javascript,Json,Ajax,编辑 我简化了我试图用php脚本进行JSON编码的数组。php脚本中的returnArr现在只有一个键、值对,但仍然出现无效字符错误: PHP script: $returnArr["a"] = "val"; er('Content-type:application/json;charset=utf-8'); echo(json_encode($returnArr)); 我试图从服务器端php脚本向ajax调用返回一个数组(以key=>value的形式)。Ajax接收
PHP script:
$returnArr["a"] = "val";
er('Content-type:application/json;charset=utf-8');
echo(json_encode($returnArr));
我试图从服务器端php脚本向ajax调用返回一个数组(以key=>value的形式)。Ajax接收到响应,但无法解析服务器返回的JSON数据。在ajax success函数中解析返回数据的行上给出错误“无效字符” 下面是我的服务器端脚本:
$returnArr = Array();
header('Content-Type: application/json');
foreach($selectUpdatedRecord as $eachRow)
{
$key = $eachRow['cat_id'];
$htmlStr = '<td>'.$eachRow["cat_id"].'</td>
<td>'.$eachRow["cat_name"].'</td>
<td>
<select name="statCat-catId-'.$eachRow["cat_id"].'" disabled="disabled">
<option value="'.$eachRow["cat_status"].'" selected="selected">'.$eachRow["cat_status"].'</option>
<option value="Enabled">Enabled</option>
<option value="Disabled">Disabled</option>
</select></td>
<td>'.$eachRow["created_at"].'</td>
<td><button type="submit" id="save-cat-'.$eachRow["cat_id"].'" name="save-cat-'.$eachRow["cat_id"].'" class="btn btn-info save-ind">Save</button></td>
<td><input type="checkbox" class="select_cats" name="cat_edit_array" value="'.$eachRow['cat_id'].'"></td>
';
$returnArr[$key] = $htmlStr;
}
echo json_encode($returnArr);
我尝试在ajax调用中包含数据类型:作为JSON,并省略了JSON.parse调用,但结果仍然相同
非常感谢您的帮助。问题确实出在JSON.parse中,但是,还有更多的问题 问题1:JSON.parse方法需要字符串作为参数。因此,当您提供数组或对象时,会出现错误。检查以下示例代码:
var obj = {};
try {
JSON.parse( obj );
}
catch( err ) {
console.error( err );
}
问题-2:现在,第二个问题是不是您可能已经理解的PHP中的json_encode()。因为json_encode()PHP函数确实返回字符串。但是,由于您正在发送JSON MIME类型标头:
header('Content-Type: application/json');
jQuery将其作为JSON对象接收
默认情况下,PHP以html的形式返回输出,因此,如果删除标题,则不会出现错误。因此,请清除浏览器缓存并尝试删除标题或使用以下标题之一:
header('Content-Type: text/plain');
// or the default one:
// header('Content-Type: text/html');
问题3:您还需要了解jQuery ajax函数的数据类型属性
根据文档,数据类型定义为:
期望从服务器返回的数据类型。如果未指定,jQuery将尝试根据响应的MIME类型推断它(XML MIME类型将生成XML,在1.4中JSON将生成JavaScript对象,在1.4中脚本将执行脚本,其他任何内容都将作为字符串返回)
因此,当您不指定数据类型时,jQuery会因为您的MIME类型头自动将其作为JSON获取。因此,即使您指定:
dataType: 'json',
同样的问题不会消失。现在猜猜如果我们特别告诉jQuery以文本形式接收数据会发生什么情况:
dataType: 'text',
你可能猜对了。一旦我们提到要接收数据作为文本,即使在PHP中我们发送JSON MIME类型报头,jQuery会将其视为文本,JSON.PARSE将无错误地执行。
注意:当您通过更改标题进行测试时,请记住浏览器将缓存结果。因此,每次使用新标题进行测试或使用其他随机查询字符串调用脚本时,都需要清除浏览器缓存,如下所示:
您还可以检查浏览器从浏览器开发工具的网络面板接收的数据类型(如html、文本、json等)(数据类型将显示在类型列中)。您从请求中得到了什么?也许它是空的,或者不是json?我看到您试图将HTML添加到json对象中。我认为在javascript中,这是一个错误的json设计,因此无法解析为对象数组。returnedText可能已经是json了。我认为您不必解析它,您可以从浏览器的“网络”选项卡(开发人员工具)验证呼叫的响应。如果可能的话,在这里发布响应,这样我们就可以找出哪里出了问题。尝试使用
header('Content-type:application/json;charset=utf-8')
dataType: 'text',
url: "ajax_catEdit_loader.php?rand=" + Math.random(),