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无效。 见下面的截图。 我怎么解决这个问题?
这可能是BOM标记的问题。 尝试将文件保存为普通的UTF-8。
我遇到了同样的问题,但是我无法找到我的Windows上的哪个文件以带有BOM的UTF8保存(尽管我已经尝试尽可能多地搜索文件)。
但是,我发现了解决方法。 假设在服务器端我有
die(json_encode(array( 'OK' => 1 )))
- 在$ .ajax调用中,我删除条目“datatype:’json’”并使用以下行访问响应:
success: function (response) { var data = $.parseJSON(response); console.log(data.OK); // = 1 }
- 在$ .ajax调用中,我仍然保留条目“datatype:’json’”,然后我必须访问响应中的值,就像这样
var dataOK = response [‘OK’]; // = 1