Wie extrahiere ich Daten aus JSON mit PHP?

Mar 28 2015

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

460 user3942918 Mar 28 2015 at 02:38

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:

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 trueals 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:

  1. Der JSON besteht ganz aus genau dem null.
  2. Der JSON ist ungültig - überprüfen Sie das Ergebnis von json_last_error_msgoder setzen Sie es durch etwas wie JSONLint .
  3. 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 .

19 MohdAbdulMujib Oct 26 2016 at 20:24

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_decodeerfordert, dass die Zeichenfolge gültig ist, jsonsonst wird sie zurückgegeben NULL.
  • json_last_error()Kann im Falle eines Dekodierungsfehlers die genaue Art des Fehlers bestimmen.
  • Stellen Sie sicher, dass Sie utf8Inhalte übergeben, da json_decodesonst Fehler auftreten können, und geben Sie einfach einen NULLWert zurück.
2 Sayeedamin Nov 06 2019 at 19:31
// 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>";
}
1 KankatalaKrishna Aug 06 2019 at 13:08

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
PaulBurilichev Jan 22 2020 at 21:48

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 XPathfür XMLSie diesen Ansatz beginnt zu lieben.