Wie extrahiere ich Daten aus JSON mit PHP?
Dies soll eine allgemeine Referenzfrage und -antwort sein, die viele der nie endenden Fragen "Wie greife ich in meinem JSON auf Daten zu?" Abdeckt. Fragen. Hier werden die allgemeinen Grundlagen des Dekodierens von JSON in PHP und des Zugriffs auf die Ergebnisse behandelt.
Ich habe den JSON:
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
Wie dekodiere ich dies in PHP und greife auf die resultierenden Daten zu?
Antworten
Intro
Zuerst haben Sie eine Zeichenfolge. JSON ist kein Array, kein Objekt oder keine Datenstruktur. JSON ist ein textbasiertes Serialisierungsformat - also eine ausgefallene Zeichenfolge, aber immer noch nur eine Zeichenfolge. Dekodieren Sie es in PHP mit json_decode()
.
$data = json_decode($json);
Darin finden Sie vielleicht:
- Skalare: Strings , Ints , Floats und Bools
- Nullen (ein spezieller Typ für sich)
- zusammengesetzte Typen: Objekte und Arrays .
Dies sind die Dinge, die in JSON codiert werden können. Genauer gesagt sind dies PHP-Versionen der Dinge, die in JSON codiert werden können.
Sie haben nichts Besonderes. Sie sind keine "JSON-Objekte" oder "JSON-Arrays". Sie haben den JSON dekodiert - Sie haben jetzt grundlegende alltägliche PHP-Typen .
Objekte werden Instanzen von stdClass sein , einer integrierten Klasse, die nur eine generische Sache ist , die hier nicht wichtig ist.
Zugriff auf Objekteigenschaften
Sie greifen auf die Eigenschaften eines dieser Objekte genauso zu wie auf 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";
}
Glasierte
Schokolade mit Streuseln
Ahorn
Oder spielen Sie mit einer der unzähligen integrierten Array-Funktionen .
Zugriff auf verschachtelte Elemente
Die Eigenschaften von Objekten und die Elemente von Arrays können mehr Objekte und / oder Arrays sein. Sie können einfach weiterhin wie gewohnt auf ihre Eigenschaften und Elemente 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
Passing 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. Sie greifen wieder wie gewohnt auf deren 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
Wenn Sie ein JSON- Objekt in ein assoziatives PHP-Array dekodieren , können Sie sowohl Schlüssel als auch Werte mithilfe der foreach (array_expression as $key => $value)
Syntax iterieren , 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;
}
Druckt
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'.
Ich weiß nicht, wie die Daten strukturiert sind
Lesen Sie die Dokumentation zu dem, von dem Sie den JSON erhalten.
Schauen Sie sich den JSON an - wo Sie sehen, dass geschweifte Klammern {}
ein Objekt erwarten, wo Sie sehen, dass eckige Klammern []
ein Array erwarten.
Treffen Sie die dekodierten Daten mit einem 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üfen Sie 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
)
)
)
Hier erfahren Sie, wo Sie Objekte haben, wo Sie Arrays haben, sowie die Namen und Werte ihrer Mitglieder.
Wenn Sie nur so weit hinein kommen können, bevor Sie sich verlaufen - gehen Sie so weit und treffen Sie das mit print_r()
:
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
Schauen Sie sich das in diesem praktischen interaktiven JSON-Explorer an .
Teilen Sie das Problem in Teile auf, die sich leichter um den Kopf wickeln lassen.
json_decode()
kehrt zurück null
Dies geschieht, weil entweder:
- Der JSON besteht ganz aus genau dem
null
. - Der JSON ist ungültig - überprüfen Sie das Ergebnis von
json_last_error_msg
oder setzen Sie es durch 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 den JSON generiert, weist einen Fehler auf), und verhindern Sie, dass dies geschieht.
Der Name der Objekteigenschaft enthält ein Sonderzeichen
Manchmal haben Sie einen Objekteigenschaftsnamen, der so etwas wie einen Bindestrich -
oder ein Vorzeichen enthält, @
das nicht in einer Literal-ID verwendet werden kann. Stattdessen können Sie ein Zeichenfolgenliteral in geschweiften Klammern verwenden, um es zu adressieren.
$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 - in Ihrem JSON ist JSON als Zeichenfolge codiert. Dekodieren Sie, greifen Sie wie gewohnt auf die Zeichenfolge zu, dekodieren Sie diese und gelangen Sie schließlich zu dem, was Sie benötigen.
$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 json_decode()
, um sofort damit fertig zu werden, wird es schwierig. Sehen:
Wie man es sortiert
Siehe: Referenz: Alle grundlegenden Möglichkeiten zum Sortieren von Arrays und Daten in PHP .
Mit json_decode () können Sie einen json-String in ein PHP-Objekt / Array 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 wird sie zurückgegebenNULL
.json_last_error()
Kann im Falle eines Dekodierungsfehlers die genaue Art des Fehlers bestimmen.- Stellen Sie sicher, dass Sie
utf8
Inhalte übergeben, dajson_decode
sonst Fehler auftreten können, und geben Sie einfach einenNULL
Wert zurück.
// Using json as php array
$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';
//or use from file
//$json = file_get_contents('results.json');
$someArray = json_decode($json, true);
foreach ($someArray as $key => $value) {
echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}
Wir können json string mit der Funktion json_decode in php in ein Array dekodieren
1) json_decode ($ json_string) // es wird ein Objekt zurückgegeben
2) json_decode ($ json_string, true) // 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
Erwägen Sie die Verwendung von JSONPath
https://packagist.org/packages/flow/jsonpath
Es gibt eine ziemlich klare Erklärung, wie man es verwendet und eine JSON-Datei analysiert, wobei alle vorgeschlagenen Schleifen vermieden werden . Wenn Sie sind vertraut mit XPath
für XML
Sie diesen Ansatz beginnt zu lieben.