Ответ 1
Посмотрите на второй параметр json_decode($json, $assoc, $depth)
на http://docs.php.net/json_decode
Соблюдайте этот маленький 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
получить ТОЧНЫЙ тот же результат?
Посмотрите на второй параметр 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 ({}
= объект), имеющий свойство "материал" со значением "вещи" и имеет свойство "вещи", при этом значение является массивом ( []
= массив).
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 для кодирования/декодирования (это даже совместимая с PHP 5 обратная совместимость), написанная в этом сообщении в блоге: Использование json_encode() и json_decode() в PHP4 (июнь 2009 г.).
Конкретный код - Михал Мигурский и Мэтт Кнапп: