php json_encode - PullRequest
       17

php json_encode

2 голосов
/ 30 мая 2011

У меня есть приложение Symfony, которое использует json_encode и json_decode, чтобы вести учет некоторых цен. Проблема в том, что json_decode работает нормально в одном файле (я могу декодировать строку, хранящуюся в моей базе данных PSQL), но когда я вызываю ее из другого файла, json_decode возвращает ноль, я проверяю кодировки файлов (все являются utf -8) таблицы и кодировка базы данных (тоже utf-8). Так что я не знаю, где может быть проблема, попробовал utf8_encode() тоже ...

Любая помощь будет оценена. Спасибо.

Вот действительный кодированный json (это был массив, закодированный php json_encode)

{"1":{"1":{"fechaInicio":"30-05-2011","precios":{"1":{"precio":"20000","abreviatura":"CLP"}},"fechaRetiro":"31-05-2011"}},"2":{"2":{"fechaInicio":"30-05-2011","precios":{"1":{"precio":"20000","abreviatura":"CLP"}},"fechaRetiro":"31-05-2011"}}}

Массив:

$preciosOfertor = Array ( [unidades] => Array ( [1] => Array ( [1] => Array ( [fechaInicio] => 30-05-2011 [precios] => Array ( [1] => Array ( [precio] => 20000 [abreviatura] => CLP ) ) [fechaRetiro] => 31-05-2011 ) ) [2] => Array ( [2] => Array ( [fechaInicio] => 30-05-2011 [precios] => Array ( [1] => Array ( [precio] => 20000 [abreviatura] => CLP ) ) [fechaRetiro] => 31-05-2011 ) ) ) ) 

Для кодирования я использую:

$preciosOfertor = json_encode($preciosOfertor); 

Тогда я звоню

$precios = json_decode($databaseObject->getPreciosOfertor(),true); 

Когда я использую json_decode в файле, который кодирует массив, он работает, но затем, когда я использую его в другом файле проекта, я просто получаю NULL с var_dump ().

Установил Services_JSON как предложено, но теперь я получаю пустой массив

Кодированный json с Services_JSON:

{"unidades":{"1":{"1":{"fechaInicio":"30-05-2011","precios":{"1":{"precio":"20000","abreviatura":"CLP"}},"fechaRetiro":"31-05-2011"}}}}

Но когда я вызываю $ json-> decode (), я получаю Array ()

Ответы [ 5 ]

2 голосов
/ 31 мая 2011

Хорошо, люди, сначала спасибо всем за помощь.

Я получил решение, и все это было благодаря библиотеке Zend Json.

Symfony использует стратегии экранирования для предотвращения XSS-атак, SQLАтаки с использованием инъекций и т. Д. Итак, что произошло здесь, в моем случае, когда я вызвал json_encode и json_decode, он был внутри объекта, который Doctrine генерирует для представления моего объекта (в данном случае резервирования), так как это был локальный вызов данных строки(valoresOfertor), данные из базы данных не были экранированы, поэтому методы работали нормально.

Но затем, когда я попытался кодировать и декодировать значения строки вне класса резервирования, Symfony использовал свою стратегию экранирования, так что

"

стал

&quot

Итак, пробуя разные библиотеки JSON, я использовал Zend one и увидел исключение, которое отображалось (Синтаксическая ошибка:

    at Zend_Json::decode('{"unidades":{"1":{"1":{"fechaInicio":"30-05-2011","precios":{"1":{"precio":"20000","abreviatura":"CLP"}},"fechaRetiro":"31-05-2011"}},"2":{"2":{"fechaInicio":"30-05-2011","precios":{"1":{"precio":"20000","abreviatura":"CLP"}},"fechaRetiro":"31-05-2011"}}}}')
in SF_ROOT_DIR/apps/saas/modules/editreserva/templates/habitacionesSuccess.php line 20 ...

Итак, я добавил следующую строку:

htmlspecialchars_decode($jsonVariable);

И это сработало.

Надеюсь, это поможет кому-то, если он поэкспериментирует с symФони и Джсон.

0 голосов
/ 30 мая 2011

Если вы имеете дело с шаблоном, взгляните на:

$sf_data->getRaw();

http://www.geeganage.com/symfony-json-made-easy/

0 голосов
/ 30 мая 2011

From php.net : NULL возвращается, если json не может быть декодирован или если закодированные данные глубже, чем предел рекурсии.
Так что либо вы установили предел рекурсии e ниже, чем глубина данных (что может показаться не так, если вы говорите, что он работает на другой странице), либо json не может быть декодирован.
Если он работает на одной странице, а на другой - нет, проверьте кодировку файла.
Первая страница может быть закодирована в utf-8 (кодировка вашего json), но вторая может быть чем-то другим (например, ascii). также проверить bom. Вам может понадобиться закодировать страницу в utf -8 без бомжа.

0 голосов
/ 30 мая 2011

Насколько я знаю, в предыдущих версиях PHP была одна или несколько ошибок в json_encode () и json_encode (). Вы можете попробовать обновить PHP до последней версии или использовать внешнюю библиотеку для кодирования и декодирования JSON. Есть некоторые, но я думаю, что PEAR JSON является лучшим.

0 голосов
/ 30 мая 2011

это может быть UTF-8 BOM присутствует.Попробуйте использовать UTF без кодировки BOM.Также выведите json_last_error () , чтобы увидеть, в чем проблема.

РЕДАКТИРОВАТЬ:

Это IS действительный JSON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...