2009-11-24 1 views
4

Я работаю над проектом в PHP (5.3.1), где мне нужно отправить строку JSON в webservice (в python), но результат, который я получаю из json_encode, не проходит как действительный JSON (я использую JSLint для проверки действительности).Недопустимая кодировка PHP JSON

Я должен добавить, что структура, которую я пытаюсь кодировать, довольно большая (13 КБ кодируется) и состоит частично из данных UTF8, а в то время как json_encode обрабатывает ее, я получаю пробелы в странных местах в результате. Например, я мог бы получить {"hello": tru e} или {"hell o": true}, что приводит к ошибке из веб-службы, поскольку JSON недействителен (или данные, как во втором примере).

Я также пытался использовать рамки Zend для кодирования JSON, но это не сильно отличалось.

Есть ли известная проблема с JSON в PHP? Кто-нибудь сталкивался с этим поведением и нашел решение?

ответ

3

другого день я обрабатывал некоторые автоматически сгенерированные сообщения электронной почты и заметил то же странное поведение (пробела были вставлены в тело письма), так что я начал проверять электронную почту и нашел виновник:

От SMTP RFC2821:

максимальная общая длина текста линии, включая 1000 символов (не считая ведущего точка дублируется для прозрачности).

Мое электронное письмо действительно было в одной строке, поэтому разбив его на \ n, исправили проблемы с пространством.

6

Конечно ключи объектов не могут содержать пробелы или символы некодированного кода, неупомянутые переменные могут быть только логическими, целочисленными, float, объектами и значением массива, строки всегда должны быть указаны.

Кроме того, я бы рекомендовал вам добавить правильный заголовок перед выходом json.

if(!headers_sent()) 
    header('Content-Type: application/json; charset=utf-8', true,200); 

Вы можете также разместить свой массив или объект, который вы проходящий в json_encode?

6

Вы заявляете, что «структура, которую я пытаюсь кодировать ... состоит частично из данных UTF8». Это означает, что он также частично относится к данным, не относящимся к UTF8. json_encode doc имеет комментарий в нижней части, что

json_encode() ожидает, что строки должны быть закодированы в формате UTF8, а по умолчанию PHP строки ISO-8859-1. Это означает, что

json_encode (массив ('àü'));

будет производить JSon представление пустой строки, в то время как

json_encode (массив (utf8_encode ('Àu')));

будет работать.

Являются ли неисправные сегменты JSON из-за входа не UTF8?

+0

На самом деле, я попытался utf8 закодировать весь мой контент до json, кодируя его, но это не сработало – Ofir

+0

Ошибки не связаны напрямую с UTF-8. Я могу получить логическое значение с пространством в нем или что-то в этом роде (true e вместо true) – Ofir

1

После того, как я почесал голову почти на целый день, я пришел к выводу, что проблема не в функции json_encode. Это было с моей функцией почты.

В основном, json_encode готовил данные для отправки другой службе. До сегодняшнего дня я использовал stream_context_create и fopen для отправки данных во внешнюю службу, но теперь я использую fsockopen и fputs и, похоже, работает.

Хотя я не уверен, как в природе проблемы, я рад, что теперь работает :)

КСТАТИ: После этого процесса, я почту себя входной и выходной (как в формате JSON), и это как я увидел, что проблема была в первую очередь. Эта проблема по-прежнему сохраняется, но я думаю, что это связано с кодировкой почты или что-то в этом роде.