Странное поведение json_decode () - PullRequest
3 голосов
/ 09 апреля 2010

Возьмите следующую строку JSON (сгенерированную некоторым кодом ExtJS - но это не имеет значения):

[{"action":"Setting","method":"toggle","data":["welcome-home"],"type":"rpc","tid":2},{"action":"ContentExtFeFillout","method":"todo","data":[true,0,8,false],"type":"rpc","tid":3}]

отправляется на сервер в виде запроса POST и извлекается через $GLOBALS['HTTP_RAW_POST_DATA'].

Запуск

json_decode($GLOBALS['HTTP_RAW_POST_DATA']);

на нашей машине разработки (5.2.10-2ubuntu6.4 с Suhosin Patch 0.9.7) дает правильный print_r() вывод:

Array
(
    [0] => stdClass Object
        (
            [action] => Setting
            [method] => toggle
            [data] => Array
                (
                    [0] => welcome-home
                )

            [type] => rpc
            [tid] => 2
        )

    [1] => stdClass Object
        (
            [action] => ContentExtFeFillout
            [method] => todo
            [data] => Array
                (
                    [0] => 1
                    [1] => 0
                    [2] => 8
                    [3] =>
                )

            [type] => rpc
            [tid] => 3
        )
)

Выполнение того же кода на производственном компьютере клиента (5.2.5 с Suhosin Patch 0.9.6.2 и Zend Optimizer; кстати, SUSE Linux) дает следующий вывод print_r():

Array
(
    [0] => stdClass Object
        (
            [action] => Setting
            [method] => toggle
            [data] => Array
                (
                    [0] => welcome-home
                )

            [type] => rpc
        )

    [1] => 2
    [2] => stdClass Object
        (
            [action] => ContentExtFeFillout
            [method] => todo
            [data] => Array
                (
                    [0] => 1
                    [1] => 0
                    [2] => 8
                    [3] => 
                )

            [type] => rpc
        )

    [3] => 3
)

Обратите внимание на отсутствующее свойство tid, которое, очевидно, было перемещено в основной массив как собственное значение - это естественным образом нарушает весь следующий код.

Мы также загрузили версию PHP для Windows 5.2.5, чтобы проверить, есть ли ошибка в json_decode(), но мы получаем правильный вывод здесь.

Есть ли какие-либо известные проблемы с json_decode(), которые могли бы вызвать это странное поведение?

В настоящее время мы совершенно невежественны ...

Спасибо всем вам!

С уважением

Stefan

Ответы [ 2 ]

1 голос
/ 09 апреля 2010

ОК, ребята - проблема решена. Не имея больше опций, мы убедили клиента обновить установленную версию PHP и угадайте, что: это работает.

Кажется, в их установке PHP была небольшая ошибка (PHP, Zend Optimizer и / или Suhosin), которая была исправлена ​​в обновлении. Тем не менее, довольно странная вещь.

Спасибо всем вам!

С наилучшими пожеланиями

Stefan

0 голосов
/ 09 апреля 2010

Вы пытались поменять местами клавиши tid и type? Также как насчет использования жестко закодированной переменной, чтобы проверить, может ли быть проблема с $ GLOBALS ['HTTP_RAW_POST_DATA']?

Попробуйте следующее:

$t1='[{"action":"Setting","method":"toggle","data":["welcome-home"],"type":"rpc","tid":2},{"action":"ContentExtFeFillout","method":"todo","data":[true,0,8,false],"tid":2,"type":"rpc"}]';
print_r(json_decode($t1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...