json_encode / json_decode - gibt stdClass anstelle von Array in PHP zurück

108

Beachten Sie dieses kleine Skript:

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

Warum verwandelt PHP das JSON-Objekt in eine Klasse?

Sollte ein Array, das json_encodeddann ist json_decoded, nicht das GENAUE gleiche Ergebnis liefern?

Derek Adair
quelle

Antworten:

145

Schauen Sie sich den zweiten Parameter json_decode($json, $assoc, $depth)unter https://secure.php.net/json_decode genauer an

VolkerK
quelle
7
Beantwortet die Frage nicht - warum ist eine stdClass die Standardeinstellung? Siehe auch stackoverflow.com/questions/3193765/…
William Entriken
7
Dies beantwortet die Frage wirklich nicht, sondern bietet lediglich eine Problemumgehung. Aber eine miese Problemumgehung, IMO. Was ist, wenn json-codierte Objekte automatisch als Objekte und json-decodierte assoziative Arrays automatisch als assoziative Arrays decodiert werden sollen? Die Verwendung des zweiten Parameters für json_decode () impliziert eine menschliche Intervention. Ehrlich gesagt, das ist blöd (von PHP, nicht von dieser Antwort)
JDS
@JDS Sie können diese Funktionen sehr einfach umbrechen und eigene Funktionen erstellen, in denen der Quelltyp bei Bedarf transparent in einem JSON-Schlüssel gespeichert wird.
Sivann
2
@JDS Ich habe eine Antwort hinzugefügt, die tatsächlich die Frage beantwortet: "Warum verwandelt PHP das JSON-Objekt in eine Klasse?"
7ochem
82
$arrayDecoded = json_decode($arrayEncoded, true);

gibt Ihnen ein Array.

Kai Chan
quelle
2
Dies ist sehr hilfreich, danke @Kai Chain - ich nehme an, die ursprüngliche Frage lautete "Warum", aber dies scheint zu dem zu gelangen, was sie beabsichtigt hatten. Wie auch immer, perfekt für meine Situation.
Ghukill
Und macht den gleichen Job nach 4 Jahren hier! Grundkenntnisse, die jeder zuerst lernen sollte, wie ich!
KJS
20

Um die eigentliche Frage zu beantworten:

Warum verwandelt PHP das JSON-Objekt in eine Klasse?

Schauen Sie sich die Ausgabe des codierten JSON genauer an. Ich habe das Beispiel, das das OP gibt, ein wenig erweitert:

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

Das JSON-Format wurde vom gleichen Standard wie JavaScript ( ECMAScript Programming Language Standard ) abgeleitet. Wenn Sie sich das Format ansehen, sieht es wie JavaScript aus. Es ist ein JSON- Objekt ( {}= Objekt ) mit einer Eigenschaft "stuff" mit dem Wert "things" und einer Eigenschaft "things", wobei der Wert ein Array von Zeichenfolgen ( []= array) ist ) ist.

JSON (als JavaScript) kennt keine assoziativen Arrays, sondern nur indizierte Arrays.Wenn JSON ein assoziatives PHP-Array codiert, führt dies zu einer JSON-Zeichenfolge, die dieses Array als "Objekt" enthält.

Jetzt dekodieren wir den JSON erneut mit json_decode($arrayEncoded). Die Dekodierungsfunktion weiß nicht, woher diese JSON-Zeichenfolge stammt (ein PHP-Array), daher dekodiert sie in ein unbekanntes ObjektstdClass in PHP befindet. Wie Sie sehen werden, wird das String-Array "things" in ein indiziertes PHP-Array dekodiert.

Siehe auch:


Vielen Dank an https://www.randomlists.com/things für die "Dinge"

7ochem
quelle
2
Dies ist die richtige Antwort ... sie beantwortet die Frage, während die anderen Problemumgehungen für ein ungeklärtes Problem geben. Danke, ich habe im Kreis vergessen, dass JSON keine assoziativen Arrays unterstützt!
Marcus
5

Wie bereits erwähnt, können Sie hier einen zweiten Parameter hinzufügen, um anzugeben, dass ein Array zurückgegeben werden soll:

$array = json_decode($json, true);

Viele Leute ziehen es möglicherweise vor, stattdessen die Ergebnisse zu verwenden:

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

Es könnte klarer zu lesen sein.

Andrew
quelle
4
Es gibt verschiedene. Beachten Sie, ob Sie ein mehrdimensionales Array oder Objekt codiert haben. Das erste gibt Ihnen ein Array von Arrays, das zweite gibt Ihnen ein Array von Objekten.
Hector
2

tl; dr: JavaScript unterstützt keine assoziativen Arrays, daher auch nicht JSON.

Immerhin ist es JSON, nicht JSAAN. :) :)

PHP muss also Ihr Array in ein Objekt konvertieren, um es in JSON zu codieren.

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

Wenn Sie den JSON in ein Array dekodieren, gehen in dieser Situation Informationen verloren.

bijiDango
quelle