json_encode创建格式错误的JSON(带有额外的隐藏字符)

我正在使用PHP的json_encode()返回一些数据,由jQuery的ajax()检索:

简化的JS:

 $.ajax({ dataType: 'json', contentType: 'application/json', cache: false, type: 'POST', url: './api/_imgdown.php', error: function(jqXHR, textStatus, errorThrow) { console.log(jqXHR, textStatus, errorThrow); }, success: function(data, textStatus, jqXHR) { console.log(data, textStatus, jqXHR); } }); 

PHP是:

 header('Content-Type: application/json; charset=UTF-8'); //default apiResponse $apiResponse = [ "status" => 1, "message" => "success", "data" => null ]; 

然后当php运行我的代码时,它会通过添加这些数据结束:

 $apiResponse['data'][] = [ "mid" => (int)$mid, "card_type" => $card_type, "header_size" => (int)$headers['Content-Length'], "saved_size" => (int)filesize($imgSavePath), "saved_path" => $imgSavePath ]; //spit out the JSON echo json_encode($apiResponse); exit(); 

JSON:

 {"status":1,"message":"success","data":[{"mid":340052,"card_type":"kakusei","header_size":48337,"saved_size":48337,"saved_path":"..\/card\/kakusei\/340052.png"}]} 

起初似乎有效。 我检索此PHP的Ajax总是以parseerror结束(因此进入ajax()error部分)。

如果您在http://jsonlint.com/上复制并粘贴此JSON,则会显示“Unexpected token”和http://jsonformatter.curiousconcept.com/表示无效。

我试过echo json_encode($apiResponse, JSON_UNESCAPED_SLASHES); 即使逃避斜线是好的\/但没有区别。

但是什么不完全有效? PHP不应该返回有效的JSON吗?

额外信息:使用PHP上的PHP 5.4.XX在Windows7,Chrome v28.XX上进行测试

我在实际发布这个之前已经读过的问题:

  • json_encode创建格式错误的JSON数据?
  • https://stackoverflow.com/a/15654848/684932
  • 关于json_encode和ajax dataType:“json”
  • php json_encode没有返回正确的json编码字符串

更新:

从SO复制到JSONlint会产生有效的json。 所以我进一步调查并注意到PHP正在创建一个奇怪的隐藏字符,实际上使json无效。 见下面的截图。 我怎么解决这个问题? json无效的字符

这可能是BOM标记的问题。 尝试将文件保存为普通的UTF-8。

我遇到了同样的问题,但是我无法找到我的Windows上的哪个文件以带有BOM的UTF8保存(尽管我已经尝试尽可能多地搜索文件)。

但是,我发现了解决方法。 假设在服务器端我有

 die(json_encode(array( 'OK' => 1 ))) 
  1. 在$ .ajax调用中,我删除条目“datatype:’json’”并使用以下行访问响应:
 success: function (response) { var data = $.parseJSON(response); console.log(data.OK); // = 1 } 
  1. 在$ .ajax调用中,我仍然保留条目“datatype:’json’”,然后我必须访问响应中的值,就像这样

var dataOK = response [‘OK’]; // = 1