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
ответить на актуальный вопрос:
почему 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.
Смотрите также:
- RFC 4627-тип носителя application/json для объекта JavaScript
- RFC 7159-обозначение объекта JavaScript (JSON) Данные 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 (это даже обратная совместимость PHP 5), написанная в этом блоге: использование json_encode() и json_decode () в PHP4 (июнь 2009).
конкретный код Михал Мигурски и Мэтт Кнапп:
- JSON-PHP / январь 2005
- код:http://mike.teczno.com/JSON/JSON.phps
- Предложение Груша : http://pear.php.net/pepr/pepr-proposal-show.php?id=198
- Пакета Pear: http://pear.php.net/package/Services_JSON
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 в массив, информация будет потеряна в этой ситуации.