json_encode / json_decode - возвращает stdClass вместо Array в PHP - PullRequest
101 голосов
/ 17 февраля 2010

Посмотрите на этот маленький сценарий:

$array = array('stuff' => 'things');
print_r($array);
//prints - Array ( [stuff] => things )
$arrayEncoded = json_encode($array);
echo $arrayEncoded . "<br />";
//prints - {"stuff":"things"}
$arrayDecoded = json_decode($arrayEncoded);
print_r($arrayDecoded);
//prints - stdClass Object ( [stuff] => things )

Почему PHP превращает объект JSON в класс?

Не должен ли массив с json_encoded тогда json_decoded дать ТОЧНЫЙ тот же результат?

Ответы [ 7 ]

138 голосов
/ 17 февраля 2010

Присмотритесь ко второму параметру json_decode($json, $assoc, $depth) в https://secure.php.net/json_decode

75 голосов
/ 17 февраля 2010
$arrayDecoded = json_decode($arrayEncoded, true);

дает вам массив.

15 голосов
/ 08 сентября 2015

Чтобы ответить на актуальный вопрос:

Почему PHP превращает объект JSON в класс?

. Более подробно рассмотрим вывод закодированного JSON, я расширил пример, который дает OP:

$array = array(
    'stuff' => 'things',
    'things' => array(
        'controller', 'playing card', 'newspaper', 'sand paper', 'monitor', 'tree'
    )
);
$arrayEncoded = json_encode($array);
echo $arrayEncoded;
//prints - {"stuff":"things","things":["controller","playing card","newspaper","sand paper","monitor","tree"]}

Формат JSON был получен из того же стандарта, что и JavaScript ( Стандарт языка программирования ECMAScript ), и если посмотреть на формат, он выглядит как JavaScript. Это JSON объект ({} = объект ), имеющий свойство "stuff" со значением "вещи" и имеющий свойство "вещи", значение которого является массивом строк ([] = массив ).

JSON (как JavaScript) не знает ассоциативных массивов, только индексированные массивы. Так что, когда JSON кодирует ассоциативный массив PHP, это приведет к строке JSON, содержащей этот массив в качестве «объекта».

Теперь мы снова декодируем JSON, используя json_decode($arrayEncoded). Функция декодирования не знает, откуда взялась эта строка JSON (массив PHP), поэтому она декодируется в неизвестный объект, который в PHP равен stdClass. Как вы увидите, массив строк "things" будет декодирован в индексированный массив PHP.

Также см .:


Спасибо https://www.randomlists.com/things за «вещи»

4 голосов
/ 30 ноября 2016

Хотя, как уже упоминалось, вы можете добавить второй параметр, чтобы указать, что вы хотите вернуть массив:

$array = json_decode($json, true);

Многие люди могут предпочесть бросить результаты:

$array = (array)json_decode($json);

Это может быть более понятным для чтения.

2 голосов
/ 31 января 2016

tl; dr: JavaScript не поддерживает ассоциативные массивы, поэтому также не поддерживает JSON.

В конце концов, это JSON, а не JSAAN. :)

Таким образом, PHP должен преобразовать ваш массив в объект для кодирования в JSON.

1 голос
/ 16 июля 2018
    var_dump(json_decode('{"0":0}'));    // output: object(0=>0)
    var_dump(json_decode('[0]'));          //output: [0]

    var_dump(json_decode('{"0":0}', true));//output: [0]
    var_dump(json_decode('[0]', true));    //output: [0]

Если вы декодируете json в массив, информация будет потеряна в этой ситуации.

0 голосов
/ 26 января 2011

Существует также хорошая библиотека PHP 4 json для кодирования / декодирования (которая даже совместима с PHP 5), о которой написано в этом сообщении: Использование json_encode () и json_decode () в PHP4 (июнь 2009 г.) *.

Конкретный кодекс написан Михалом Мигурски и Мэттом Кнаппом:

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