json_encode / json_decode - PHP'de Array yerine stdClass döndürür


108

Bu küçük betiğe bakın:

$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 Nesnesini neden bir sınıfa dönüştürür?

Daha json_encodedsonra json_decodedTAM aynı sonucu vermesi gerekmez mi?

Yanıtlar:


146

İkinci parametre en yakından bakın json_decode($json, $assoc, $depth)en https://secure.php.net/json_decode


7
Soruyu cevaplamıyor - neden bir stdClass öntanımlıdır. Ayrıca bkz. Stackoverflow.com/questions/3193765/…
William Entriken

7
Bu gerçekten soruyu cevaplamıyor, sadece bir çözüm sağlıyor. Ama berbat bir çözüm, IMO. Ya json ile kodlanmış nesnelerin nesneler olarak kodunun çözülmesini ve json tarafından kodlanmış ilişkilendirilebilir dizilerin otomatik olarak ilişkilendirilebilir diziler olarak kodunun çözülmesini istiyorsanız? Json_decode () için ikinci parametrenin kullanılması bir tür insan müdahalesi anlamına gelir. Açıkçası, bu berbat (PHP'nin bu cevabı değil)
JDS

@JDS, bu işlevleri kolayca sarabilir ve gerekirse, kaynak türünü şeffaf bir şekilde bir json anahtarında saklayan kendi işlevlerinizi oluşturabilirsiniz.
sivann

2
@JDS "PHP, JSON Nesnesini neden bir sınıfa dönüştürür?" Sorusuna gerçekten cevap veren bir yanıt ekledim.
7ochem

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

size bir dizi verir.


2
Bu çok üzücü bir şekilde yardımcı oldu, teşekkür ederim @Kai Chain - sanırım asıl soru "Neden" diye soruyordu, ama bu onların amaçladıkları şeye ulaşmış gibi görünüyor. Durum ne olursa olsun, durumum için mükemmel.
ghukill

Ve burada 4 yıl sonra aynı işi yapıyor! Benim gibi herkesin önce çalışması gereken temel bilgiler!
KJS

21

Asıl soruyu cevaplamak için:

PHP, JSON Nesnesini neden bir sınıfa dönüştürür?

Kodlanmış JSON'un çıktısına daha yakından bakın, OP'nin verdiği örneği biraz genişlettim:

$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 biçimi, JavaScript ( ECMAScript Programlama Dili Standardı ) ile aynı standarttan türetilmiştir ve biçime bakarsanız JavaScript'e benziyor. Bu, "şeyler" değerine sahip "stuff" özelliğine sahip bir JSON nesnesidir ( {}= nesne ) ve değeri bir dizeler dizisi ( []= dizi ) olan "şeyler" özelliğine sahiptir .

JSON (JavaScript olarak) ilişkilendirilebilir dizileri yalnızca dizinlenmiş dizileri bilmez. Dolayısıyla, JSON bir PHP ilişkisel dizisini kodlarken, bu, bu diziyi bir "nesne" olarak içeren bir JSON dizesiyle sonuçlanır.

Şimdi tekrar JSON kodunu çözüyoruz json_decode($arrayEncoded). Kod çözme işlevi, bu JSON dizesinin (bir PHP dizisi) nereden kaynaklandığını bilmez, bu nedenle PHP'de bulunan bilinmeyen bir nesneye kod çözer stdClass. Göreceğiniz gibi, "şeyler" dizge dizisi, dizinlenmiş bir PHP dizisinin kodunu çözecektir.

Ayrıca bkz:


Https://www.randomlists.com/things'e 'şeyler' için teşekkürler


2
bu doğru cevap ... soruyu cevaplarken diğerleri açıklanamayan bir soruna geçici çözümler sunar. Teşekkürler, JSON'un ilişkisel dizileri desteklemediğini unutarak çevrelere giriyordum!
marcus

5

Yine de belirtildiği gibi, bir dizinin döndürülmesini istediğinizi belirtmek için buraya ikinci bir parametre ekleyebilirsiniz:

$array = json_decode($json, true);

Birçok kişi bunun yerine sonuçları yayınlamayı tercih edebilir:

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

Okumak daha net olabilir.


4
Farklı var. Çok boyutlu bir dizi veya nesneyi kodlayıp kodlamadığınızın farkında olun. Birincisi size dizi dizisi verir, ikincisi size nesne dizisi verir.
Hector

2

tl; dr: JavaScript ilişkilendirilebilir dizileri desteklemez, dolayısıyla JSON da desteklemez.

Sonuçta, JSON, JSAAN değil. :)

Dolayısıyla, PHP'nin JSON'a kodlamak için dizinizi bir nesneye dönüştürmesi gerekir.


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]

Eğer json kodunu diziye çevirirseniz, bu durumda bilgi kaybolacaktır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.