JSON无效(JSONview),但我不知道如何

时间:2012-09-27 19:26:20

标签: php json json-view

好吧,我一直都很疯狂。我正在从PHP输出JSON,而Chrome和Firefox的JSON View扩展声称它无效。这两个扩展程序在JSON View's example上都能正常工作,所以看起来我的JSON实际上 错误了 - 但我不知道是什么。

Firefox版本有一条错误消息:

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

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

设置标题,如下所示: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 View;我经常使用非常大的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内容不相关,因此删除它似乎更安全。请参阅下面的答案。

1 个答案:

答案 0 :(得分:1)

哎呀。

我明白了:物流清单搞砸了,但当然它也是完全看不见的。在没有BOM的情况下检查并将编码更改为UTF-8可以完全解决问题。

我不知道这个BOM的问题是PHP的设计还是Unicode的设计问题,但它肯定是令人讨厌的。