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

时间:2013-07-02 14:07:59

标签: php jquery ajax 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);
    }
});

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无效。见下面的截图。我怎么解决这个问题? json invalid character

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:-1)

我遇到了同样的问题,但是我无法找到我的Windows上的哪个文件以带有BOM的UTF8保存(即使我试图尽可能多地搜索文件)。

但是,我已经找到了解决方法。 假设在服务器端我有

die(json_encode(array(
    'OK' => 1
)))
  1. 在$ .ajax调用中,我删除条目“datatype:'json'”,然后使用以下行访问响应:
  2. success: function (response) {
          var data = $.parseJSON(response); 
          console.log(data.OK); // = 1
      }
    
    1. 在$ .ajax调用中,我仍保留条目“datatype:'json'”,然后我必须像这样访问响应中的值
    2.   

      var dataOK = response ['OK']; // = 1

相关问题