json_encode / json_decode - mengembalikan stdClass daripada Array di PHP

108

Perhatikan skrip kecil ini:

$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 )

Mengapa PHP mengubah Objek JSON menjadi kelas?

Seharusnya tidak array yang json_encodedkemudian json_decodedmenghasilkan hasil yang sama EXACT?

Derek Adair
sumber

Jawaban:

145

Perhatikan lebih dekat parameter kedua json_decode($json, $assoc, $depth)di https://secure.php.net/json_decode

VolkerK
sumber
7
Tidak menjawab pertanyaan - mengapa stdClass default. Lihat juga stackoverflow.com/questions/3193765/…
William Entriken
7
Ini benar-benar tidak menjawab pertanyaan, itu hanya memberikan solusi. Tapi solusi yang buruk, IMO. Bagaimana jika Anda ingin objek yang dikodekan json didekodekan sebagai objek dan larik asosiatif yang didekodekan json untuk didekodekan sebagai larik asosiatif, secara otomatis? Menggunakan parameter kedua ke json_decode () menyiratkan semacam campur tangan manusia. Terus terang, ini menyebalkan (PHP, bukan jawaban ini)
JDS
@JDS Anda dapat dengan mudah menggabungkan fungsi-fungsi itu dan membuatnya sendiri yang menyimpan tipe sumber dalam kunci json secara transparan jika Anda perlu.
sivann
2
@JDS Saya telah menambahkan jawaban yang benar-benar menjawab pertanyaan "Mengapa PHP mengubah Objek JSON menjadi kelas?"
7ochem
82
$arrayDecoded = json_decode($arrayEncoded, true);

memberi Anda sebuah array.

Kai Chan
sumber
2
Ini sangat membantu, terima kasih, @Kai Chain - Saya kira pertanyaan aslinya adalah bertanya, "Mengapa", tapi ini sepertinya mendapatkan apa yang mereka inginkan. Apapun masalahnya, cocok untuk situasi saya.
ghukill
Dan melakukan pekerjaan yang sama setelah 4 tahun di sini! Pengetahuan dasar yang seharusnya dipelajari semua orang dulu, seperti saya!
KJS
20

Untuk menjawab pertanyaan sebenarnya:

Mengapa PHP mengubah Objek JSON menjadi kelas?

Lihatlah lebih dekat pada output dari JSON yang dikodekan, saya telah memperpanjang contoh yang diberikan OP sedikit:

$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"]}

Format JSON diturunkan dari standar yang sama dengan JavaScript ( Standar Bahasa Pemrograman ECMAScript ) dan jika Anda akan melihat formatnya seperti JavaScript. Ini adalah objek JSON ( {}= objek ) yang memiliki properti "barang" dengan nilai "hal" dan memiliki properti "benda" dengan nilainya berupa array string ( []= array ).

JSON (sebagai JavaScript) tidak mengenal array asosiatif hanya array yang diindeks. Jadi, ketika JSON mengenkode array asosiatif PHP, ini akan menghasilkan string JSON yang berisi array ini sebagai "objek".

Sekarang kami mendekode JSON lagi menggunakan json_decode($arrayEncoded). Fungsi decode tidak tahu dari mana string JSON ini berasal (array PHP) sehingga decoding menjadi objek yang tidak diketahui, yaitu stdClassdalam PHP. Seperti yang akan Anda lihat, larik string "things" AKAN didekode menjadi larik PHP terindeks.

Lihat juga:


Terima kasih kepada https://www.randomlists.com/things untuk 'hal-hal'

7ochem
sumber
2
ini adalah jawaban yang benar ... ini menjawab pertanyaan, sedangkan yang lain memberikan solusi untuk masalah yang tidak dapat dijelaskan. Terima kasih, saya berputar-putar lupa bahwa JSON tidak mendukung array asosiatif!
marcus
5

Meskipun, seperti yang disebutkan, Anda dapat menambahkan parameter kedua di sini untuk menunjukkan bahwa Anda menginginkan sebuah array dikembalikan:

$array = json_decode($json, true);

Banyak orang mungkin lebih suka memberikan hasil sebagai gantinya:

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

Mungkin lebih jelas untuk dibaca.

Andrew
sumber
4
Ada yang berbeda. Berhati-hatilah jika Anda telah menyandikan array atau objek multidimensi. Yang pertama memberi Anda array dari array, yang kedua memberi Anda array objek.
Hector
2

tl; dr: JavaScript tidak mendukung array asosiatif, oleh karena itu JSON juga tidak.

Bagaimanapun, ini JSON, bukan JSAAN. :)

Jadi PHP harus mengubah array Anda menjadi objek untuk dikodekan menjadi JSON.

LaVache
sumber
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]

Jika Anda mendekode json ke dalam array, informasi akan hilang dalam situasi ini.

bijiDango
sumber