Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php json_编码创建格式错误的json(带有额外隐藏字符)_Php_Jquery_Ajax_Json_Parse Error - Fatal编程技术网

Php json_编码创建格式错误的json(带有额外隐藏字符)

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) {

我使用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) {
        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
      }