JSON для кодирования/декодирования формата JSON - возвращает stdClass вместо массива в 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 96

7 ответов:

взгляните поближе на второй параметр json_decode($json, $assoc, $depth) at https://secure.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), и если вы посмотрите на формат, похоже, Яваскрипт. Это JSON объект ({} = object) имея свойство "вещи" со значением "вещи" и имеет свойство "вещи" с его значением, являющимся массивом строк ([] = array).

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

теперь мы декодирование JSON снова с помощью json_decode($arrayEncoded). Функция декодирования не знает, откуда взялась эта строка JSON (массив PHP), поэтому она декодируется в неизвестный объект, который является stdClass в PHP. Как вы увидите, массив строк "things" будет декодироваться в индексированный массив 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).

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

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