Соблюдайте этот маленький сценарий:
$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.
Также см:
Благодаря 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 г.) .
Конкретный код – Михал Мигурский и Мэтт Кнапп: