У кого-нибудь есть проблемы с переходом от метода serializeJSON ColdFusion к json_decode PHP?

Interwebs здесь не помогут. Мы кодируем данные в ColdFusion с помощью serializeJSON и пытаемся декодировать их в PHP с помощью json_decode. В большинстве случаев это работает нормально, но в некоторых случаях json_decode возвращает NULL. Мы искали очевидных виновников, но, похоже, serializeJSON форматирует все так, как ожидалось. В чем еще может быть проблема?

ОБНОВЛЕНИЕ: несколько человек (разумно) попросили меня опубликовать результат, который вызывает проблему. Я бы сделал это, если бы только мы не обнаружили, что набор результатов - это все наши данные (перечисляющая информация для более чем 2300 объектов аренды, всего 565 135 символов ASCII)! Это могло быть проблемой, хотя я ничего не видел в документации PHP о максимальном размере строки. Что там будет ограничивающим фактором? ОЗУ?

ОБНОВЛЕНИЕ II: Похоже, проблема заключалась в том, что несколько наших пользователей скопировали и вставили текст Microsoft Word с «умными» кавычками. Эти надоедливые пользователи ...

У вас есть пример вывода JSON, который декодируется в NULL?

modius 01.10.2008 05:48

Это отличный вопрос / проблема. Удалось ли вам решить эту проблему? Я помню, что эти цитаты всегда убийственны - например, попробуйте вывести их во флэш-памяти. Я думаю, мы использовали МБ, чтобы исправить кодировку, и тогда это сработало, хотя я не могу вспомнить.

Till 01.10.2008 07:10

cflib.org имеет отличный UDF «деморонизатор» для удаления случайных вещей, которые вставляет Word.

Ben Doom 01.10.2008 22:25

Я считаю, что вы можете легко очистить данные. См. Мой ответ, который включает способ CF и способ исправить это PHP.

Stewart Robinson 26.07.2009 13:33

Могут ли они каким-то образом закодироваться в строку Unicode JSON вместо их удаления?

Henry 27.07.2009 21:35

JSON может справиться со всем Unicode, включая кавычки. Если кодировка правильная (рекомендуется UTF-8; UTF-16 и 32 также действительны для спецификация), эти символы не должны вызывать проблемы.

TRiG 03.04.2015 16:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
6
2 086
4

Ответы 4

можете ли вы надежно воспроизвести эту проблему? и если да, можете ли вы опубликовать образцы данных, которые возвращают значение 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, поскольку я чувствовал, что оно более элегантное из двух.

Решение PHP

Исправьте строку, прежде чем передавать ее в json_decode ()

$string = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);

Решение ColdFusion

Используйте функцию cleanXmlString () в этом вопросе SO после использования serializeJSON ()

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