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, но это, безусловно, неприятно.