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 получить json_decoded такой же результат?

json_decode($json, $assoc, $depth) рассмотрим второй параметр json_decode($json, $assoc, $depth) адресу http://docs.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 ), и если вы посмотрите на формат, он выглядит как JavaScript. Это объект JSON ( {} = object ), имеющий свойство «материал» со значением «вещи» и имеет свойство «вещи» с его значением, являющимся массивом строк ( [] = array ).

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

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

Также см:

  • RFC 4627 – Тип приложения / json Media для объекта JavaScript
  • RFC 7159 – Обозначение объекта JavaScript (JSON) Data Interchang
  • Руководство 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 encode / decode library (то есть даже обратная совместимость с PHP 5 ), описанная в этом сообщении в блоге: Использование json_encode () и json_decode () в PHP4 (июнь 2009 г.) .

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