【问题标题】:strange javascript behavior - JSON.parse: unexpected character奇怪的 javascript 行为 - JSON.parse:意外字符
【发布时间】:2013-11-23 14:36:18
【问题描述】:

我有以下按钮:

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

当我将注册()函数更改为这样时:

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

它像这样正确显示警报消息:

{"state":"done"}

那么为什么它拒绝解析一切似乎都正常的响应?有什么想法吗?

【问题讨论】:

    标签: javascript php jquery json codeigniter


    【解决方案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。您显然是在服务器端代码中的某处输出此内容。您需要找出它在哪里并将其删除。

    【讨论】:

    • 所以当我执行此警报(data.state)时它应该可以工作;不解析数据,但是当我这样做时,它会在警报消息中显示“未定义”。
    • @OpEtMaR 那么,您能否在浏览器控制台上检查它,而不是使用alertconsole.dir 将为您提供大部分信息。
    • @OpEtMaR 我的意思是console.dir(data);
    • @OpEtMaR console.log(data.charCodeAt(0)); 怎么样?也许您在数据之前输出了一些不可见的字符。
    • 感谢@lonsemeday :),我刚刚将 php 页面编码更改为 utf-8,没有 bom,现在一切正常。
    【解决方案2】:

    不再解析数据:

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

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多