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

时间:2013-11-23 14:36:18

标签: javascript php jquery json codeigniter

我有以下按钮:

<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"}

那么为什么它拒绝解析一切似乎没问题的答案?任何想法?

2 个答案:

答案 0 :(得分:1)

我的猜测是你的代码实际上比你想象的更好!我认为jQuery从服务器接收你的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文档的开头是byte order mark。您显然是在服务器端代码中的某处输出它。您需要找出它的位置并将其删除。

答案 1 :(得分:1)

不要再次解析数据:

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