首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >json_encode创建格式错误的JSON (带有额外的隐藏字符)

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

Stack Overflow用户
提问于 2013-07-02 14:07:58
回答 2查看 8.6K关注 0票数 6

我使用PHP的json_encode()返回一些由jQuery的ajax()检索的数据

简化的联合材料:

代码语言:javascript
复制
$.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是:

代码语言:javascript
复制
header('Content-Type: application/json; charset=UTF-8');
//default apiResponse
$apiResponse = [
    "status" => 1,
    "message" => "success",
    "data" => null
];

然后,当php运行我的代码时,它以添加以下数据结束:

代码语言:javascript
复制
$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:

代码语言:javascript
复制
{"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,它会显示“意外令牌”,而http://jsonformatter.curiousconcept.com/ valid则无效。

我已经尝试过echo json_encode($apiResponse, JSON_UNESCAPED_SLASHES);,尽管转义斜杠是可以的,\/,但是没有什么区别。

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

额外信息:在Windows7上进行测试,Chromev28.XX,在Apache上使用PHP5.4.XX

我在发帖之前读过的一些问题:

更新:

从SO复制到JSONlint提供有效的json。因此,我进一步研究了一下,并注意到PHP正在创建一个奇怪的隐藏字符,实际上使json无效。见下面的截图。我怎么解决的?

​

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-02 14:31:11

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

票数 8
EN

Stack Overflow用户

发布于 2015-03-19 10:47:16

我也遇到过同样的问题,但是我找不到哪个文件保存在UTF8中(尽管我已经尝试了尽可能多地搜索这些文件)。

然而,我已经找到了解决办法。假设在服务器端我有

代码语言:javascript
复制
die(json_encode(array(
    'OK' => 1
)))
  1. 在$.ajax调用中,我删除条目"datatype:'json'“,并使用以下行访问响应:

成功:函数(响应){ var data =$.parseJSON(响应);console.log(data.OK);// =1}

  1. 在$.ajax调用中,我仍然保留条目"datatype:'json'",然后必须像下面这样访问响应中的值

变量dataOK =响应‘’OK‘;// =1

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17427775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档