Json_encode/json_decode - возвращает stdClass вместо Array в PHP

Соблюдайте этот маленький script:

$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 получить ТОЧНЫЙ тот же результат?

Ответ 2

$arrayDecoded = json_decode($arrayEncoded, true);

дает массив.

Ответ 3

Чтобы ответить на фактический вопрос

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

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

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

Также смотрите:


Благодаря https://www.randomlists.com/things для "вещей"

Ответ 4

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

$array = json_decode($json, true);

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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