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?

Jawaban:


145

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


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.


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'


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.


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.


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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.