json_encode / json_decode - повертає stdClass замість масиву в PHP


108

Дотримуйтесь цього маленького сценарію:

$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дав точний результат?

Відповіді:


145

Придивіться на другий параметр json_decode($json, $assoc, $depth)в https://secure.php.net/json_decode


7
Не відповідає на питання - чому типовим є stdClass. Дивіться також stackoverflow.com/questions/3193765 / ...
William Entriken

7
Це дійсно не відповідає на питання, воно просто забезпечує вирішення. Але хитрий спосіб вирішення, ІМО. Що робити, якщо ви хочете, щоб кодовані json об'єкти декодувались як об'єкти, а асоційовані масиви, декодовані json, автоматично розшифровувались як асоціативні масиви? Використання другого параметра для json_decode () означає певне втручання людини. Чесно кажучи, це вдало (PHP, не з цієї відповіді)
JDS

@JDS ви можете дуже легко перетворити ці функції і створити свою власну, яка зберігає тип джерела в ключі json, якщо це потрібно.
sivann

2
@JDS Я додав відповідь, яка насправді відповідає на питання "Чому PHP перетворює об'єкт JSON в клас?"
7оч.

82
$arrayDecoded = json_decode($arrayEncoded, true);

дає вам масив.


2
Це настільки чудово корисно, дякую @Kai Chain - я вважаю, що в оригінальному запитанні було "Чому", але це, здається, виходить із того, що вони мали намір. Як би там не було, ідеально підходить для моєї ситуації.
ghukill

І робить ту ж роботу через 4 роки тут! Основні знання, які кожен насправді повинен вивчити спочатку, як і я!
KJS

20

Щоб відповісти на власне питання:

Чому 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 за "речі"


2
це правильна відповідь ... вона дає відповідь на питання, тоді як інші дають обхідні пояснення незрозумілої проблеми. Дякую, я ходив по колах, забуваючи, що JSON не підтримує асоціативні масиви!
Марк

5

Хоча, як було сказано, ви можете додати тут другий параметр, щоб вказати, що хочете повернути масив:

$array = json_decode($json, true);

Багато людей можуть замість цього віддавати результати:

$array = (array)json_decode($json);

Це може бути зрозуміліше для читання.


4
Є різні. Будьте в курсі, якщо ви закодували багатовимірний масив або об'єкт. Перший дає вам масив масивів, другий - масив об’єктів.
Гектор

2

tl; dr: JavaScript не підтримує асоціативні масиви, тому JSON також не підтримує.

Зрештою, це JSON, а не JSAAN. :)

Таким чином, PHP повинен перетворити свій масив в об'єкт, щоб кодувати в JSON.


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


0

Також у цій публікації в блозі написано гарну бібліотеку кодування / декодування PHP 4 json (тобто навіть PHP 5): Використання json_encode () та json_decode () у PHP4 (червень 2009) .

Конкретний код - Міхал Мігурський та Метт Кнапп:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.