Php json_编码创建格式错误的json(带有额外隐藏字符)
我使用PHP的Php json_编码创建格式错误的json(带有额外隐藏字符),php,jquery,ajax,json,parse-error,Php,Jquery,Ajax,Json,Parse Error,我使用PHP的json\u encode()返回一些数据,这些数据由jQuery的ajax()检索: 简化JS: $.ajax({ dataType: 'json', contentType: 'application/json', cache: false, type: 'POST', url: './api/_imgdown.php', error: function(jqXHR, textStatus, errorThrow) {
json\u 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
部分)
如果复制并粘贴此JSON,它会显示“意外令牌”,并显示无效
我尝试了echo-json\u-encode($apiResponse,json\u UNESCAPED\u SLASHES)代码>即使转义斜杠是可以的\/
,但没有区别
但什么不完全有效?PHP不应该返回有效的JSON吗?
额外信息:在Windows7、ChromeV28.XX上测试,在Apache上使用PHP5.4.XX
我在发布这篇文章之前读过的问题:
更新:
从SO复制到JSONlint将提供有效的json。所以我进一步研究了一下,发现PHP正在创建一个奇怪的隐藏字符,这实际上使json无效。请参见下面的屏幕截图。我怎么解决这个问题?
这可能是一个带有BOM标记的问题。尝试将该文件保存为普通UTF-8。我遇到了相同的问题,但我无法找到我的Windows上的哪个文件是以带BOM的UTF8格式保存的(尽管我已尝试尽可能多地搜索这些文件)
不过,我已经找到了解决办法。
假设在服务器端我有
die(json_encode(array(
'OK' => 1
)))
在$.ajax调用中,我删除了条目“datatype:'json'”,并使用以下行访问响应:
在$.ajax调用中,我仍然保留条目“datatype:'json'”,然后我必须像这样访问响应中的值
var dataOK=响应['OK'];//=一,
问题:您能否尝试将$apiResponse['data'][[
更改为$apiResponse['data']=[
,看看它是否工作得更好?我不明白您为什么要将数据
元素添加为一个数组,其中包含另一个数组,作为一个单层数组应该没问题(除非您确实需要它)。在php输出给所有添加注释的人之前,您是否有一些文本输出:请阅读更新,我发现真正的问题是什么(粘贴到Stackoverflow上时实际上“已修复”,因此不再无效)。它可能是一个BOM字符,但我不知道它为什么会出现……您能确定返回数据中第一个字符的ASCII码吗?使用console.log(data.charCodeAt(0))
。它可能就是那个BOM字符。但是我所有的PHP文件都是带有BOM标记的UTF-8,我总是像你一样回显json,我从来没有遇到过问题。编码问题总是很烦人:)我添加了它作为一个真实的答案:)是的,正如你帮助发现的,是BOM字符65279
。我发现了另一个问题这个问题问题是我需要BOM,因为卡片类型
可能有拉丁字符,例如áã
,这些字符没有编码到HTML实体中,因此在保存时没有BOM
。我将保存为普通UTF-8,并尝试使用htmlentities()
谢谢,希望能成功。感谢您抽出时间回答!哦,我的上帝。我们已经为这个问题搜索了两天了……谢谢!:-)
success: function (response) {
var data = $.parseJSON(response);
console.log(data.OK); // = 1
}