У кого-нибудь есть проблемы с переходом от метода serializeJSON в ColdFusion к json_decode в PHP? - PullRequest
5 голосов
/ 01 октября 2008

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

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

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

Ответы [ 4 ]

2 голосов
/ 05 октября 2008

Вы можете попробовать работать в UTF-8, а также сообщить PHP об этом факте.

У меня была проблема с тем, что json_decode PHP не смог декодировать строку JSON UTF-8 (с некоторыми «странными» символами, кроме имеющихся у вас кавычек). Мое решение состояло в том, чтобы намекнуть PHP, что я работаю в режиме UTF-8, вставив метатег Content-Type на страницу HTML, которая выполняла отправку в PHP. Таким образом, тип содержимого представленных данных, который является строкой JSON, также будет UTF-8:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

После этого PHP json_decode смог правильно декодировать строку.

1 голос
/ 26 июля 2009

У меня была именно эта проблема, и оказалось, что это произошло из-за того, что ColdFusion не поместил печатных символов в пакеты JSON (эти символы действительно существовали в наших данных), но они не могут войти в JSON.

Два вопроса на этом сайте исправили эту проблему для меня, хотя я выбрал решение PHP, а не решение ColdFusion, так как мне показалось, что оно было более элегантным.

PHP-решение

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

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

Решение ColdFusion

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

1 голос
/ 01 октября 2008

Вы можете надежно повторить эту проблему? и если да, можете ли вы опубликовать пример данных, который возвращает ноль? Я уверен, что вы это знаете, но для информации, для других, кто не знает, что это не так, RFC 4627 описывает JSON, и распространенная ошибка - считать допустимый Javascript действительным JSON. лучше думать о JSON как о подмножестве javascript.

в ответ на правку:

Я бы предложил проверить, чтобы убедиться, что ваша информация заполняется в вашем PHP-скрипте (до ее передачи в json_decode), а также проверять эту информацию (особенно, если вы можете надежно воспроизвести ошибку). Вы можете попробовать онлайн-валидатор для удобства. исходя из очень ограниченной информации, звучит так, будто время истекло, а данные не собраны? нужен ли такой большой набор данных?

0 голосов
/ 01 октября 2008

Вы можете попробовать проанализировать его с помощью другого парсера и найти ошибку - я знаю, что парсеры Python JSON очень высокого качества. Если у вас установлен Python, достаточно просто запустить текст с помощью средства проверки синтаксиса demjson . Если это очень большой набор данных, вы можете использовать мою библиотеку jsonlib - использование памяти будет выше, чем у demjson, но будет работать быстрее, потому что написано на C.

...