Dies soll eine allgemeine Referenzfrage und -antwort sein, die viele der nie endenden Fragen abdeckt “Wie greife ich auf Daten in meinem JSON zu?” Fragen. Hier werden die allgemeinen Grundlagen der Decodierung von JSON in PHP und der Zugriff auf die Ergebnisse behandelt.
Ich habe die JSON:
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
Wie decodiere ich dies in PHP und greife auf die resultierenden Daten zu?
Einleitung
Zunächst einmal haben Sie eine Zeichenfolge. JSON ist kein Array, Objekt oder Datenstruktur. JSON ist ein textbasiertes Serialisierungsformat – also ein schicker String, aber immer noch nur ein String. Decodieren Sie es in PHP mit json_decode()
.
$data = json_decode($json);
Darin könnten Sie finden:
Dies sind die Dinge, die in JSON codiert werden können. Oder genauer gesagt, dies sind PHP-Versionen der Dinge, die in JSON codiert werden können.
Es gibt nichts Besonderes an ihnen. Sie sind keine „JSON-Objekte“ oder „JSON-Arrays“. Sie haben den JSON entschlüsselt – Sie haben es jetzt grundlegende alltägliche PHP-Typen.
Objekte werden Instanzen von sein stdClasseine eingebaute Klasse, die nur eine allgemeine Sache ist, die hier nicht wichtig ist.
Zugriff auf Objekteigenschaften
Sie greifen auf die zu Eigenschaften eines dieser Objekte auf die gleiche Weise wie für die öffentlichen nicht statischen Eigenschaften eines anderen Objekts, z $object->property
.
$json = '
{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
Zugriff auf Array-Elemente
Sie greifen auf die Elemente eines dieser Arrays genauso zu wie auf jedes andere Array, z $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
Iterieren Sie darüber mit foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Glasiert
Schokolade mit Streuseln
Ahorn
Oder verwirren Sie mit einem der Bazillion eingebaute Array-Funktionen.
Zugriff auf verschachtelte Elemente
Die Eigenschaften von Objekten und die Elemente von Arrays können mehrere Objekte und/oder Arrays sein – Sie können einfach weiterhin wie gewohnt auf ihre Eigenschaften und Mitglieder zugreifen, z $object->array[0]->etc
.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
echo $yummy->toppings[2]->id; //5004
Vorbeigehen true
als zweites Argument zu json_decode()
Wenn Sie dies tun, erhalten Sie anstelle von Objekten assoziative Arrays – Arrays mit Zeichenfolgen für Schlüssel. Auch hier greifen Sie wie gewohnt auf die Elemente zu, z $array['key']
.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json, true);
echo $yummy['toppings'][2]['type']; //Maple
Zugriff auf assoziative Array-Elemente
Beim Decodieren einer JSON Objekt zu einem assoziativen PHP-Array können Sie sowohl Schlüssel als auch Werte mit iterieren foreach (array_expression as $key => $value)
Syntax, z
$json = '
{
"foo": "foo value",
"bar": "bar value",
"baz": "baz value"
}';
$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
echo "The value of key '$key' is '$value'", PHP_EOL;
}
Drucke
Der Wert des Schlüssels „foo“ ist „foo value“.
Der Wert des Schlüssels ‘bar’ ist ‘bar value’
Der Wert des Schlüssels ‘baz’ ist ‘baz value’
Keine Ahnung, wie die Daten aufgebaut sind
Lesen Sie die Dokumentation für das, wovon Sie den JSON erhalten.
Schauen Sie sich das JSON an – wo Sie geschweifte Klammern sehen {}
erwarten Sie ein Objekt, bei dem Sie eckige Klammern sehen []
Erwarte ein Array.
Schlagen Sie die decodierten Daten mit a an print_r()
:
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
print_r($yummy);
und überprüfe die Ausgabe:
stdClass Object
(
[type] => donut
[name] => Cake
[toppings] => Array
(
[0] => stdClass Object
(
[id] => 5002
[type] => Glazed
)
[1] => stdClass Object
(
[id] => 5006
[type] => Chocolate with Sprinkles
)
[2] => stdClass Object
(
[id] => 5004
[type] => Maple
)
)
)
Es wird Ihnen sagen, wo Sie Objekte haben, wo Sie Arrays haben, zusammen mit den Namen und Werten ihrer Mitglieder.
Wenn Sie nur so weit hineinkommen können, bevor Sie sich verlaufen – gehen Sie so weit und schlagen Sie zu das mit print_r()
:
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
Schau es dir doch mal an diesen praktischen interaktiven JSON-Explorer.
Teilen Sie das Problem in Teile auf, die Sie leichter umreißen können.
json_decode()
kehrt zurück null
Dies geschieht, weil entweder:
- Der JSON besteht ausschließlich aus genau dem,
null
.
- Der JSON ist ungültig – überprüfen Sie das Ergebnis von
json_last_error_msg
oder setzen Sie es durch so etwas wie JSONLint.
- Es enthält Elemente, die mehr als 512 Ebenen tief verschachtelt sind. Diese standardmäßige maximale Tiefe kann überschrieben werden, indem eine Ganzzahl als drittes Argument an übergeben wird
json_decode()
.
Wenn Sie die maximale Tiefe ändern müssen, lösen Sie wahrscheinlich das falsche Problem. Finden Sie heraus, warum Sie so tief verschachtelte Daten erhalten (z. B. der von Ihnen abgefragte Dienst, der JSON generiert, hat einen Fehler) und sorgen Sie dafür, dass dies nicht passiert.
Objekteigenschaftenname enthält ein Sonderzeichen
Manchmal haben Sie einen Objekteigenschaftsnamen, der so etwas wie einen Bindestrich enthält -
oder am Zeichen @
was nicht in einem wörtlichen Bezeichner verwendet werden kann. Stattdessen können Sie ein Zeichenfolgenliteral in geschweiften Klammern verwenden, um es anzusprechen.
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
Wenn Sie eine Ganzzahl als Eigenschaft haben, lesen Sie: Wie greife ich auf Objekteigenschaften mit Namen wie Ganzzahlen zu? als Referenz.
Jemand hat JSON in Ihr JSON eingefügt
Es ist lächerlich, aber es passiert – es gibt JSON, das als Zeichenfolge in Ihrem JSON codiert ist. Decodieren, wie gewohnt auf den String zugreifen, decodieren dasund kommen Sie schließlich zu dem, was Sie brauchen.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';
$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);
echo $toppings[0]->type; //Glazed
Daten passen nicht in den Speicher
Wenn Ihr JSON zu groß ist für json_decode()
sofort zu handhaben, wird es schwierig. Sehen:
- Verarbeitung großer JSON-Dateien in PHP
- So iterieren Sie richtig durch eine große JSON-Datei
Wie man es sortiert
Siehe: Referenz: Alle grundlegenden Methoden zum Sortieren von Arrays und Daten in PHP.
Sie können verwenden json_decode() um einen JSON-String in ein PHP-Objekt/Array zu konvertieren.
Z.B.
Eingang:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
Ausgabe:
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)
}
Einige Punkte, an die Sie sich erinnern sollten:
json_decode
erfordert, dass die Zeichenfolge gültig ist json
sonst geht es zurück NULL
.
- Falls die Dekodierung fehlschlägt,
json_last_error()
kann verwendet werden, um die genaue Art des Fehlers zu bestimmen.
- Stellen Sie sicher, dass Sie vorbeikommen
utf8
Inhalt bzw json_decode
kann einen Fehler auslösen und einfach a zurückgeben NULL
Wert.
Wir können die json-Zeichenfolge mithilfe der json_decode-Funktion in PHP in ein Array dekodieren
1) json_decode($json_string) // gibt Objekt zurück
2) json_decode($json_string,true) // es gibt ein Array zurück
$json_string = '{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$array = json_decode($json_string,true);
echo $array['type']; //it gives donut
Die akzeptierte Antwort ist sehr detailliert und in den meisten Fällen korrekt.
Ich möchte nur hinzufügen, dass ich beim Versuch, eine mit UTF8 codierte JSON-Textdatei zu laden, eine Fehlermeldung erhalten habe. Ich hatte eine gut formatierte JSON, aber „json_decode“ gab mir immer NULL zurück, es lag an der Stücklistenmarke.
Um es zu lösen, habe ich diese PHP-Funktion erstellt:
function load_utf8_file($filePath)
{
$response = null;
try
{
if (file_exists($filePath)) {
$text = file_get_contents($filePath);
$response = preg_replace("/^\xEF\xBB\xBF/", '', $text);
}
} catch (Exception $e) {
echo 'ERROR: ', $e->getMessage(), "\n";
}
finally{ }
return $response;
}
Dann verwende ich es so, um eine JSON-Datei zu laden und daraus einen Wert zu erhalten:
$str = load_utf8_file('appconfig.json');
$json = json_decode($str, true);
//print_r($json);
echo $json['prod']['deploy']['hostname'];
https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w
Überprüfen Sie den folgenden Code zum Konvertieren von JSON in Array in PHP
Wenn JSON dann richtig ist json_decode()
funktioniert gut und gibt ein Array zurück, aber wenn JSON falsch formatiert ist, wird es zurückgegeben NULL
,
<?php
function jsonDecode1($json){
$arr = json_decode($json, true);
return $arr;
}
// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );
Wenn JSON falsch formatiert ist und Sie nur ein Array erwarten, können Sie diese Funktion verwenden.
<?php
function jsonDecode2($json){
$arr = (array) json_decode($json, true);
return $arr;
}
// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );
Wenn JSON falsch formatiert ist und Sie die Codeausführung stoppen möchten, können Sie diese Funktion verwenden.
<?php
function jsonDecode3($json){
$arr = (array) json_decode($json, true);
if(empty(json_last_error())){
return $arr;
}
else{
throw new ErrorException( json_last_error_msg() );
}
}
// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );
Sie können jede Funktion verwenden, abhängig von Ihren Anforderungen,
Verwandte: Kann eine Variable in der Ausgabe von print_r() sehen, ist sich aber nicht sicher, wie man im Code darauf zugreift, hier ist eine interaktive JSON-Exploration im Kontext von PHP möglich: array.include-once.org
– hakre
27. März 2015 um 21:09 Uhr
Kann ich bitte wissen, warum diese Frage nicht als doppelte Frage betrachtet wird, selbst wenn 9 oder weniger Benutzer als Duplikat für stackoverflow.com/questions/4343596/parsing-json-file-with-php markiert sind? m
– Ich bin die dümmste Person
9. August 2017 um 5:46 Uhr
@IamtheMostStupidPerson Ich werde versuchen, es zu erklären, auch wenn dein Benutzername mich bezweifeln lässt, dass du ihn verstehst ;). Diese Frage wird gestellt und ihre Antworten werden auf “kanonische” Weise geschrieben. Daher ist es ein besserer Empfänger für doppelte Ziele als die anderen Fragen.
– Félix Adriyel Gagnon-Grenier
25. Februar 2018 um 20:13 Uhr