【问题标题】:json_encode creating a malformed JSON (with extra hidden character)json_encode 创建格式错误的 JSON(带有额外的隐藏字符)
【发布时间】:2013-06-29 22:47:40
【问题描述】:

我正在使用 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"}]}

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

如果您将此 JSON 复制并粘贴到 http://jsonlint.com/ 上,它会显示“意外令牌”并且 http://jsonformatter.curiousconcept.com/ 说无效。

我已经尝试过echo json_encode($apiResponse, JSON_UNESCAPED_SLASHES);,尽管转义斜线没问题\/,但没有任何区别。

但什么不完全有效? PHP 不应该返回有效的 JSON 吗?

额外信息:在 Windows7、Chrome v28.XX 上测试,在 Apache 上使用 PHP 5.4.XX

在实际发布此问题之前我读过的问题:


更新:

从 SO 复制到 JSONlint 会得到有效的 json。所以我进一步调查并注意到 PHP 正在创建一个奇怪的隐藏字符,实际上使 json 无效。请参见下面的屏幕截图。我该如何解决?

【问题讨论】:

  • 问题:您可以尝试将$apiResponse['data'][] = [ 更改为$apiResponse['data'] = [,看看效果是否更好?我不明白你为什么要将 data 元素添加为一个数组,其中包含另一个数组,作为一个单级数组应该没问题(除非你真的需要它)。
  • 你的php输出之前有没有一些文本输出
  • 致所有添加评论的人:请阅读更新,我发现真正的问题是什么(粘贴到 Stackoverflow 时实际上是“固定的”,因此不是无效了)。
  • 它可能是一个 BOM 字符,但我不知道它为什么会出现...你能确定返回数据中第一个字符的 ASCII 码吗?使用console.log(data.charCodeAt(0))
  • 确实可能就是那个 BOM 字符。但是我所有的 PHP 文件总是带有 BOM 标记的 UTF-8,我总是像你一样回显 json,我从来没有遇到过问题。编码问题总是很烦人 :) 我将其添加为真正的答案 :)

标签: php jquery ajax json parse-error


【解决方案1】:

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

【讨论】:

  • 是的,正如您帮助发现的那样,是 BOM 字符 65279。我发现了与此问题有关的另一个问题stackoverflow.com/questions/6538203/… 问题是我需要 BOM,因为card_type 可能有拉丁字符,例如áéã,它们没有编码到 HTML 实体中,因此在没有BOM 的情况下保存时会出现问题。我将保存为普通的 UTF-8 并尝试使用 htmlentities() 并希望能正常工作。感谢您抽出宝贵时间回答!
  • 天哪。两天来一直在寻找这个问题的答案......谢谢! :-)
【解决方案2】:

我遇到了同样的问题,但我找不到我的 Windows 上的哪个文件使用 BOM 以 UTF8 格式保存(即使我尝试尽可能多地搜索这些文件)。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2014-04-24
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多