Хорошо, я с этим схожу. Я выводил 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 каждый раз, когда я их тестирую.
EDIT: Одна вещь, я обнаружил, что работает, если я это делаю:
<?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
вызывает проблему.
EDIT: Извините, я удалил dbinfo.php
из этого вопроса, потому что он может содержать конфиденциальные данные, которые не должны быть общедоступными (хотя я и лишал очевидных вещей). Поскольку содержимое dbinfo.php
не было релевантным, кажется, что это безопаснее удалить. См. Мой ответ ниже.
Argh.
Я понял это: спецификация навязывала вещи, но, конечно, она также была совершенно невидимой. Проверка и изменение кодировки в UTF-8 без спецификации исправила проблему полностью.
Я не знаю, связана ли эта спецификация с дизайном PHP или дизайном Unicode, но это, безусловно, неприятно.