Interwebs здесь не помогут. Мы кодируем данные в ColdFusion с помощью serializeJSON и пытаемся декодировать их в PHP с помощью json_decode. В большинстве случаев это работает нормально, но в некоторых случаях json_decode возвращает NULL. Мы искали очевидных виновников, но, похоже, serializeJSON форматирует все так, как ожидалось. В чем еще может быть проблема?
ОБНОВЛЕНИЕ: несколько человек (разумно) попросили меня опубликовать результат, который вызывает проблему. Я бы сделал это, если бы только мы не обнаружили, что набор результатов - это все наши данные (перечисляющая информация для более чем 2300 объектов аренды, всего 565 135 символов ASCII)! Это могло быть проблемой, хотя я ничего не видел в документации PHP о максимальном размере строки. Что там будет ограничивающим фактором? ОЗУ?
ОБНОВЛЕНИЕ II: Похоже, проблема заключалась в том, что несколько наших пользователей скопировали и вставили текст Microsoft Word с «умными» кавычками. Эти надоедливые пользователи ...
Это отличный вопрос / проблема. Удалось ли вам решить эту проблему? Я помню, что эти цитаты всегда убийственны - например, попробуйте вывести их во флэш-памяти. Я думаю, мы использовали МБ, чтобы исправить кодировку, и тогда это сработало, хотя я не могу вспомнить.
cflib.org имеет отличный UDF «деморонизатор» для удаления случайных вещей, которые вставляет Word.
Я считаю, что вы можете легко очистить данные. См. Мой ответ, который включает способ CF и способ исправить это PHP.
Могут ли они каким-то образом закодироваться в строку Unicode JSON вместо их удаления?
JSON может справиться со всем Unicode, включая кавычки. Если кодировка правильная (рекомендуется UTF-8; UTF-16 и 32 также действительны для спецификация), эти символы не должны вызывать проблемы.






можете ли вы надежно воспроизвести эту проблему? и если да, можете ли вы опубликовать образцы данных, которые возвращают значение null? Я уверен, что вы это знаете, но для информации для других, кто может споткнуться об этом, кто не может, RFC 4627 описывает JSON, и распространенная ошибка - предполагать, что действительный javascript является действительным JSON. лучше думать о JSON как о подмножестве javascript.
в ответ на редактирование:
Я бы посоветовал проверить, чтобы убедиться, что ваша информация введена в ваш PHP-скрипт (до того, как она будет передана в json_decode), а также проверить эту информацию (особенно если вы можете надежно воспроизвести ошибку). вы можете попробовать онлайн-валидатор для удобства. судя по очень ограниченной информации, похоже, что время ожидания истекло и не были собраны все данные? нужен ли такой большой набор данных?
Вы можете попробовать разобрать его с помощью другого парсера и найти ошибку - я знаю, что парсеры Python JSON очень высокого качества. Если у вас установлен Python, достаточно легко запустить текст через средство проверки синтаксиса Demjson. Если это очень большой набор данных, вы можете использовать мою библиотеку jsonlib - использование памяти будет выше, чем с demjson, но он будет работать быстрее, потому что он написан на C.
Вы можете попробовать работать в UTF-8, а также сообщить об этом PHP.
У меня была проблема с PHP json_decode, который не мог декодировать строку UTF-8 JSON (с некоторыми «странными» символами, кроме фигурных кавычек, которые у вас есть). Мое решение состояло в том, чтобы намекнуть PHP, что я работаю в режиме UTF-8, вставив метатег Content-Type на страницу HTML, которая выполняла отправку в PHP. Таким образом, тип содержимого отправленных данных, то есть строка JSON, также будет UTF-8:
<meta http-equiv = "Content-Type" content = "text/html;charset=utf-8"/>
После этого json_decode PHP смог правильно декодировать строку.
У меня была именно эта проблема, и оказалось, что это произошло из-за того, что ColdFusion не помещал печатные символы в пакеты JSON (эти символы действительно существовали в наших данных), но они не могут войти в JSON.
Два вопроса на этом сайте устранили эту проблему для меня, хотя я выбрал решение PHP, а не решение ColdFusion, поскольку я чувствовал, что оно более элегантное из двух.
Исправьте строку, прежде чем передавать ее в json_decode ()
$string = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);
Используйте функцию cleanXmlString () в этом вопросе SO после использования serializeJSON ()
У вас есть пример вывода JSON, который декодируется в NULL?