Chrome中的JSON.parse无法正常工作

4

我有一个奇怪的问题,无法解决。它太简单了,不可能出错。

这个问题在Chrome 12.0.742.91中存在,但在IE8 8.0.6001.19048中正常工作。

这是我的AJAX回调函数,this是XMLHttpRequest实例。

// default AJAX callback handler
function Handler() {

  if (this.readyState == 4 && this.status == 200) {

    // alert(">>"+this.responseText+"<<");
    var Response = this.responseText;
    // Response = '{"Status":0,"Data":"My Data"}';

    document.getElementById("debug").innerHTML = Response;

    var Ajax = JSON.parse(Response);

    document.getElementById("Stat1").innerHTML = Ajax.Status+"<br />"+Ajax.Data;
  }

AJAX服务器正在发送{"Status":0,"Data":"服务器数据"},并且这将在debug元素中完全相同地显示为服务器数据

header('Content-type: application/json');
print '{"Status":0,"Data":"Server Data"}';

alert(...) 显示的是 >>{"Status":0,"Data":"Server Data"}<<,JSON 数据前后没有额外空格。

但是当使用 JSON.parse() 解析时,会出现 JavaScript 错误: Illegal token。

然而,如果我硬编码相同的字符串(激活注释行),JSON.parse() 就能正常工作,并在 stat1 元素中显示数据 (My Data)。

在 IE8 中,Server Data 版本运行得非常顺畅...

我有没有忽略什么基本的东西,或者 Chrome 有已知问题吗?

[编辑] 按照请求,此处提供 XMLHTTPRequest 实例创建代码:

// Create the XMLHttpRequest object
function GetHTTPRequestObject() {

  var httpRequest = null;

  if (window.XMLHttpRequest)  {// code for IE7+, Firefox, Chrome, Opera, Safari
    httpRequest = new XMLHttpRequest();
  } else {// code for IE6, IE5
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
  }

  return httpRequest;
}

@James,我已经添加了实例创建的代码。我认为这是正确的,因为回调被调用并在Chrome中显示来自AJAX服务器的正确数据,但JSON.parse无法工作。 - Max Kielland
alert(Response); 显示什么?它显示正确的字符串吗?可能是 " 导致了错误。 - Praveen Lobo
4
请查看此问题的答案 :) - cambraca
在你的 var Response = ... 行下面添加 alert('{"Status":0,"Data":"Server Data"}' === Response); 是 true 还是 false? - James Khoury
正如我所怀疑的那样,@Cambraca,这可能与字符编码有关。我在整个网站上使用UTF8,包括标题、SQL和保存的PHP文件。 - Max Kielland
显示剩余12条评论
1个回答

3

这个链接引导我调查BOM字符。我的解决方案最终是检查Ajax流中是否有任何BOM字符,并在将其发送到JSON.parse(...)之前将它们删除。通过这种解决方案,PHP文件是否保存为UTF都无关紧要。 - Max Kielland
@Max Kielland,我建议您从PHP文件中删除BOM(它们仍然可以保存为UTF8;不需要BOM),因为BOM可能会导致发送HTTP头部时出现问题(这包括setcookie()session_start()调用)。 - binaryLV
@binaryLV 在我的开发环境中,我无法选择如何保存每个单独的文件。为了方便起见,整个项目都使用UTF8来处理多种语言。我控制着服务器和客户端,所以我不认为会有问题... - Max Kielland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接