【问题标题】:JSON is invalid (JSONview), but I don't see howJSON 无效(JSONview),但我不知道如何
【发布时间】:2012-09-19 16:04:51
【问题描述】:

好的,我已经疯了。我正在从 PHP 输出 JSON,而 Chrome 和 Firefox 的 JSON View 扩展声称它是无效的。这两个扩展在 JSON View's example 上都能正常工作,所以我的 JSON 似乎出了点问题——但我不知道是什么问题。

火狐版本有错误提示:

There was an error parsing the JSON document. The document may not be well-formed.

Chrome 版本缺少此类错误消息,但仍将 JSON 打印为纯文本。

am 设置了标头,如下所示:header('Content-Type: application/json'); 我在 Firebug 和 Chrome 的开发工具中检查了响应标头;在这两种情况下都正确设置。删除隐藏 Firefox 版本中的错误消息和明文不是等宽字体,但就是这样。

完整的请求标头:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:msgPublishID=1347362550,1345649049; logout_rem=1; sh_rand=625703e7f9f9e03efabaef56f52ff97d7f68bc67; username=kryan; password=f85720746a490ece4dd7a945f5c9ed8e25b15f1f; fullname=Kevin+Ryan; user_type=1
Host:localhost
Pragma:no-cache
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1

完整的响应标头:

Connection:Keep-Alive
Content-Length:371
Content-Type:application/json
Date:Thu, 27 Sep 2012 19:12:52 GMT
Keep-Alive:timeout=5, max=99
Server:Apache/2.4.2 (Win32) OpenSSL/1.0.1c PHP/5.4.4
X-Powered-By:PHP/5.4.4

我已经对 JSON 本身进行了许多变体,但是当像这样简单的事情时,我无法想象这是 JSON 的问题:

{"session":"expired"}

仍然失败。我反复检查过;这实际上是服务器响应的全部内容,但 JSON View 仍然抱怨。对于更复杂的 JSON,我一直在使用

echo json_encode($output, JSON_PRETTY_PRINT);

其中$output 是一个关联数组;输出看起来完全正确,但 JSON View 仍在抱怨。这是文件中唯一未被注释掉的echo

那么这里到底出了什么问题呢?我真的需要 JSON 视图;我经常使用非常大的 JSON,折叠和展开对象和数组的能力对于调试我的应用程序至关重要。 This online JSON viewer 似乎有效,但如果我每次测试时都必须复制和粘贴这些 PHP 文件的输出,我的工作效率就会受到影响。

编辑:我发现的一件事是如果我这样做:

<?php
    header('Content-Type: application/json');
    die('{"debug":true}');
    // remainder of the program as-is, starting with...
    require('dbinfo.php');

如果我继续这样做:

<?php
    header('Content-Type: application/json');
    require('dbinfo.php'); // note this comes before the die statement
    die('{"debug":true}');
    // remainder of the program as-is

我又得到了错误。

所以这意味着dbinfo.php 导致了问题。

编辑:对不起,我已经从这个问题中删除了dbinfo.php,因为它可能包含不应该公开的敏感数据(即使我去掉了明显的东西)。由于dbinfo.php内容 不相关,因此删除它似乎更安全。请参阅下面的答案。

【问题讨论】:

  • 能否请您提供为请求和响应来回发送的附加 HTTP 标头?
  • 您的错误日志中是否有任何错误?您是否检查过萤火虫或其他东西以查看正在发送到浏览器的标头?我能想到的唯一一件事是,是否已经无意中发送了某些内容,因此无法修改标头。
  • 你在客户端用什么来解析json字符串?
  • @KRyan: Wireshark
  • 两者都有 Windows 二进制文件:curlwget。以防万一,这些是命令行工具,您将在 cmd.exe 中运行它们。

标签: php json json-view


【解决方案1】:

啊。

我想通了:BOM 搞砸了,当然它也完全不可见。在没有 BOM 的情况下检查并将编码更改为 UTF-8 完全解决了问题。

不知道这个BOM的东西是PHP的设计问题还是Unicode的设计问题,但肯定很讨厌。

【讨论】:

    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多