json_decode zum Array


422

Ich versuche, eine JSON-Zeichenfolge in ein Array zu dekodieren, erhalte jedoch den folgenden Fehler.

Schwerwiegender Fehler: Objekt vom Typ stdClass kann nicht als Array in C: \ wamp \ www \ temp \ asklaila.php in Zeile 6 verwendet werden

Hier ist der Code:

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj['Result']);
?>

1
Es hätte funktioniert, wenn Sie $ob->Resultstattdessen mit zugegriffen hätten .
Lapin

Antworten:


839

Gemäß der Dokumentation müssen Sie angeben, ob Sie ein assoziatives Array anstelle eines Objekts von json_decodemöchten. Dies wäre der Code:

json_decode($jsondata, true);

4
Es stellt sich die Frage, welche Vorteile es hat, wenn es als Array und nicht als Objekt zurückgegeben wird.
Foxinni

52
Es wirft die Frage auf. "Eine Frage stellen" bedeutet, etwas anzunehmen, das noch bewiesen werden muss ( ref ). In beiden Fällen kann der Vorteil darin bestehen, dass das OP das Durchlaufen von Arrays komfortabler ist als Objekte, oder dass ein anderer, bereits implementierter Code ein Array erfordert.
Jamesnotjim

8
@jamesnotjim Die Standardimplementierung, die ein Objekt zurückgibt, könnte die Frage aufwerfen, ob Objekte bessere Rückgabewerte als Arrays sind, nicht wahr?
David Mann

7
In der Tat könnte es @DavidMann. Touché!
Jamesnotjim

8
Ich möchte den Kommentar hinzufügen (wenn auch Jahre später), dass es keine Möglichkeit gibt, dass JSON etwas anderes als Daten enthält, was dies zu einer verwirrenden "Standard" -Wahl macht.
Barry

45

Versuche dies

$json_string = 'http://www.domain.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata,true);
echo "<pre>";
print_r($obj);

27

Dies ist ein verspäteter Beitrag, aber es gibt einen gültigen Fall für das Casting json_decodemit (array).
Folgendes berücksichtigen:

$jsondata = '';
$arr = json_decode($jsondata, true);
foreach ($arr as $k=>$v){
    echo $v; // etc.
}

Wenn $jsondatajemals eine leere Zeichenfolge zurückgegeben wird (wie es meiner Erfahrung nach häufig der Fall ist), json_decodewird zurückgegeben NULL, was zu dem Fehler führt. Warnung: Ungültiges Argument für foreach () in Zeile 3 . Sie könnten eine Zeile mit if / then-Code oder einen ternären Operator hinzufügen, aber IMO ist es sauberer, Zeile 2 einfach in ... zu ändern.

$arr = (array) json_decode($jsondata,true);

... es sei denn, Sie verwenden json_decodeMillionen großer Arrays gleichzeitig. In diesem Fall kann die Leistung beeinträchtigt werden, wie @ TCB13 hervorhebt.



6

Laut der PHP-Dokumentation hat die json_decode Funktion einen Parameter namens assoc, der die zurückgegebenen Objekte in assoziative Arrays konvertiert

 mixed json_decode ( string $json [, bool $assoc = FALSE ] )

Da der Parameter assocFALSE standardmäßig aktiviert ist , müssen Sie diesen Wert auf festlegenTRUE um ein Array abzurufen.

Untersuchen Sie den folgenden Code für eine Beispielimplikation:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));

welche Ausgänge:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

5

Dies ändert es auch in ein Array:

<?php
    print_r((array) json_decode($object));
?>

6
Dies ist eine Verschwendung von CPU / Speicher, wie vorgeschlagen json_decode($object, true);das truetut genau das gleiche, intern viel schneller.
TCB13

1
@ TCB13, außer wenn Sie beide benötigen und nicht erneut decodieren möchten
Jimmy Kane

3
Stimmen Sie mit @JimmyKane überein. Ich habe versucht, beide Versionen in einem Zyklus auszuführen. Wenn Sie sowohl Objekt als auch Array benötigen (obwohl dies selten vorkommen sollte?), ist json_decode+ Casting 45% schneller als das Ausführen beider Varianten von json_decode. Auf der anderen Seite sind beide so schnell, dass der Unterschied vernachlässigbar ist , wenn Sie nicht buchstäblich Tausende von Dekodierungen benötigen .
LSerni

4

json_decodeunterstütze das zweite Argument, wenn es auf gesetzt ist, TRUEwird ein Arraystatt zurückgegeben stdClass Object. Überprüfen Sie die Handbuchseite vonjson_decode Funktion alle unterstützten Argumente und seine Details zu sehen.

Versuchen Sie zum Beispiel Folgendes:

$json_string = 'http://www.example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, TRUE); // Set second argument as TRUE
print_r($obj['Result']); // Now this will works!

3
json_decode($data, true); // Returns data in array format 

json_decode($data); // Returns collections 

Wenn Sie also ein Array möchten, können Sie das zweite Argument in der json_decodeFunktion als 'true' übergeben .


3

ich hoffe, dies wird dir helfen

$json_ps = '{"courseList":[  
            {"course":"1", "course_data1":"Computer Systems(Networks)"},  
            {"course":"2", "course_data2":"Audio and Music Technology"},  
            {"course":"3", "course_data3":"MBA Digital Marketing"}  
        ]}';

Verwenden Sie die Json-Dekodierungsfunktion

$json_pss = json_decode($json_ps, true);

Schleife über JSON-Array in PHP

foreach($json_pss['courseList'] as $pss_json)
{

    echo '<br>' .$course_data1 = $pss_json['course_data1']; exit; 

}

Ergebnis : Computersysteme (Netzwerke)


2

in PHP json_decode konvertiere json Daten in PHP assoziiertes Array
Zum Beispiel:$php-array= json_decode($json-data, true); print_r($php-array);


2

Bitte versuchen Sie dies

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, true);
echo "<pre>"; print_r($obj['Result']);
?>

2

Versuchen Sie es wie folgt:

$json_string = 'https://example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj->Result);
foreach($obj->Result as $value){
  echo $value->id; //change accordingly
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.