JSON encode/JSON decode-возвращает stdClass вместо Array в PHP

обратите внимание на этот маленький скрипт:

$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 ответов


более подробно рассмотрим второй параметр json_decode($json, $assoc, $depth) at https://secure.php.net/json_decode


$arrayDecoded = json_decode($arrayEncoded, true);

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


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

почему 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), и если вы посмотрите на формат, похоже, Яваскрипт. Это JSON объект ({} = объект) имея свойство "вещи" со значением "вещи" и имеет свойство "вещи" с его значением, являющимся массивом строк ([] = массив).

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

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

Смотрите также:


спасибо https://www.randomlists.com/things для "вещей"


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

$array = json_decode($json, true);

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

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

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


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

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

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


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

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


    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 в массив, информация будет потеряна в этой ситуации.