我正在使用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
结束(因此进入error
的{{1}}部分。)
如果您在http://jsonlint.com/上复制并粘贴此JSON,则会显示“意外令牌”并且http://jsonformatter.curiousconcept.com/表示无效。
我已经尝试了ajax()
,即使转义斜杠是正确的echo json_encode($apiResponse, JSON_UNESCAPED_SLASHES);
,但没有任何区别。
但是什么不完全有效? PHP不应该返回有效的JSON吗?
额外信息:使用PHP上的PHP 5.4.XX在Windows7,Chrome v28.XX上进行测试
我在实际发布这个问题之前已经读过的问题:
更新
从SO复制到JSONlint会产生有效的json。所以我进一步调查并注意到PHP正在创建一个奇怪的隐藏字符,实际上使json无效。见下面的截图。我怎么解决这个问题?
答案 0 :(得分:8)
这可能是BOM标记的问题。尝试将文件保存为普通的UTF-8。
答案 1 :(得分:-1)
我遇到了同样的问题,但是我无法找到我的Windows上的哪个文件以带有BOM的UTF8保存(即使我试图尽可能多地搜索文件)。
但是,我已经找到了解决方法。 假设在服务器端我有
die(json_encode(array(
'OK' => 1
)))
success: function (response) { var data = $.parseJSON(response); console.log(data.OK); // = 1 }
var dataOK = response ['OK']; // = 1