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

Rap*_*DDL 6 php ajax jquery json parse-error

我正在使用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);
    }
});
Run Code Online (Sandbox Code Playgroud)

PHP是:

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

然后当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();
Run Code Online (Sandbox Code Playgroud)

JSON:

{"status":1,"message":"success","data":[{"mid":340052,"card_type":"kakusei","header_size":48337,"saved_size":48337,"saved_path":"..\/card\/kakusei\/340052.png"}]}
Run Code Online (Sandbox Code Playgroud)

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

如果您在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上进行测试

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


更新:

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

sil*_*ire 8

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

  • 哦,我的上帝.已经为这个问题寻找了两天的答案......谢谢!:-) (3认同)