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

109

Обратите внимание на этот небольшой сценарий:

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

Дерек Адэр
источник

Ответы:

146

Взгляните на второй параметр json_decode($json, $assoc, $depth)на https://secure.php.net/json_decode.

VolkerK
источник
7
Не отвечает на вопрос - почему по умолчанию используется stdClass. См. Также stackoverflow.com/questions/3193765/…
Уильям Энтрикен
7
На самом деле это не отвечает на вопрос, а просто предлагает обходной путь. Но паршивый обходной путь, ИМО. Что, если вы хотите, чтобы объекты в кодировке json декодировались как объекты, а ассоциативные массивы, декодированные в формате json, автоматически декодировались как ассоциативные массивы? Использование второго параметра в json_decode () подразумевает какое-то вмешательство человека. Честно говоря, это отстой (PHP, а не этого ответа)
JDS
@JDS вы можете очень легко обернуть эти функции и создать свои собственные, которые прозрачно сохраняют исходный тип в ключе json, если вам нужно.
sivann
2
@JDS Я добавил ответ, который фактически отвечает на вопрос «Почему PHP превращает объект JSON в класс?»
7ochem
82
$arrayDecoded = json_decode($arrayEncoded, true);

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

Кай Чан
источник
2
Это так ужасно полезно, спасибо @Kai Chain - я полагаю, что исходный вопрос был задан: «Почему», но, похоже, это дает то, что они планировали. В любом случае, идеально подходит для моей ситуации.
ghukill
И делает ту же работу после 4 лет работы здесь! Базовые знания, которые на самом деле должен изучить каждый, как и я!
KJS
21

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

Почему 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. Как вы увидите, массив строк "things" БУДЕТ декодирован в индексированный массив PHP.

Также см:


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

7очем
источник
2
это правильный ответ ... он отвечает на вопрос, в то время как другие предлагают обходные пути для необъяснимой проблемы. Спасибо, ходил по кругу, забывая, что JSON не поддерживает ассоциативные массивы!
Marcus
5

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

$array = json_decode($json, true);

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

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

Может было бы понятнее почитать.

Андрей
источник
4
Они разные. Имейте в виду, закодировали ли вы многомерный массив или объект. Первый дает вам массив массивов, второй - массив объектов.
Гектор
2

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

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

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

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

bijiDango
источник
0

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

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

cwd
источник