奇怪的javascript行为-JSON.parse:意外字符


strange javascript behavior - JSON.parse: unexpected character

我有以下按钮:

<button onclick='enroll(<?php echo $course['cs_id']; ?>)'>enroll</button>

当用户点击它时,以下javascript函数将启动:

function enroll(id){
    $.post("<?php echo base_url().'courses/enroll/'; ?>"+id , function(data){
     obj = JSON.parse(data);
    alert(obj.state);
    });
    }

执行对php页面的post请求,该页面回显json数组,如下所示:

$data = array("state"=>"done");
die(json_encode($data));

但不幸的是,控制台中出现以下错误:

JSON.parse:意外字符

我检查了页面响应,它看起来像这样(看起来很好):

{"state":"done"}

当我把enroll()函数改成这样时:

function enroll(id){
$.post("<?php echo base_url().'courses/enroll/'; ?>"+id , function(data){
alert(data);
});
}

它正确地显示警报信息,如下所示:

{"state":"done"}

那么,为什么它拒绝在一切似乎都正常的情况下解析响应呢?知道吗?

我的猜测是,您的代码实际上比您想象的工作得更好!我认为jQuery从服务器接收您的JSON,并意识到它是JSON,尽管您还没有将其指定为JSON。(也许您的PHP正在发送Content-Type标头?)

所以data实际上已经是一个Javascript对象,jQuery已经从您的JSON中解码了它。在对象上调用JSON.parse时,它会转换为字符串[object Object],然后进行解析。[object Object]显然是无效的JSON,因此出现了意外的字符错误。


由于该字符串显然是有效的JSON,我的下一个猜测是,在字符串之前有一些数据导致解析器不满意。测试这一点的最佳方法是使用String#charCodeAt,它可以显示字符串中给定点的精确字符。

因此,使用以下代码,我们可以测试字符串中的第一个字符是什么:

console.log(data.charCodeAt(0));

您说这返回65279,它在Unicode文档的开头是一个字节顺序标记。很明显,您在服务器端代码的某个地方输出了这一信息。你需要找出它的位置并将其删除。

不要再次解析数据:

function enroll(id){
 $.post("<?php echo base_url().'courses/enroll/'; ?>"+id , function(data){
  alert(data.state);
 });
}