JSON недействителен (JSONview), но я не вижу, как

ОК, я схожу с ума с этим. Я выводю JSON из PHP, а расширение JSON View для Chrome и Firefox утверждает, что оно недопустимо. Оба расширения корректно работают на примере JSON View, поэтому вполне вероятно, что с моим 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, и способность сворачивать и расширять объекты и массивы имеет решающее значение для отладки моего приложения. Кажется, что этот онлайн-просмотрщик JSON работает, но моя производительность сильно пострадает, если мне придется копировать и вставлять выходные данные этих файлов 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 ответ

Решение

Argh.

Я понял это: спецификация все испортила, но, конечно, она была совершенно невидимой. Проверка и изменение кодировки на UTF-8 без спецификации полностью устранило проблему.

Я не знаю, является ли эта спецификация проблемой в дизайне PHP или Unicode, но это, безусловно, неприятно.

Другие вопросы по тегам