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 каждый раз, когда я их тестирую.

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