Wie extrahiere ich Daten aus JSON mit PHP?

214

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?

user3942918
quelle
1
Verwandte Themen : Kann eine Variable in der Ausgabe von print_r () sehen, ist sich aber nicht sicher, wie sie im Code darauf zugreifen soll. Eine interaktive JSON-Erkundung im Kontext von PHP ist hier möglich: array.include-once.org
hakre
Kann ich bitte wissen, warum diese Frage nicht als doppelte Frage betrachtet wird, selbst wenn 9 oder weniger Benutzer als dupliziert für stackoverflow.com/questions/4343596/parsing-json-file-with-php markiert sind ? M
Ich bin die dümmste Person
@IamtheMostStupidPerson Ich werde versuchen zu erklären, obwohl Ihr Benutzername mich bezweifeln lässt, dass Sie es bekommen werden;). Diese Frage wird gestellt und ihre Antworten werden auf "kanonische" Weise geschrieben. Als solches ist es ein besserer Empfänger für doppelte Ziele als die anderen Fragen.
Félix Gagnon-Grenier

Antworten:

428

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 deren 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 Dienst, den Sie abfragen und der den JSON generiert, hat einen Fehler), und lassen Sie dies nicht passieren.


Der Name der Objekteigenschaft enthält ein Sonderzeichen

Manchmal haben Sie einen Objekteigenschaftsnamen, der so etwas wie einen Bindestrich -oder ein Vorzeichen enthält und @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 .

user3942918
quelle
bin gerade über diese Antwort gestolpert und habe festgestellt, dass der Link zu array.include-once.org unterbrochen ist.
Jeff
@ Jeff Danke. Schade darum. Ich habe den Link entfernt.
user3942918
Ja, wenn man den Namen des Links betrachtet und wie Sie ihn beschrieben haben, klingt es wie ein echter Mist.
Jeff
Das einzige, was dieser Lösung fehlt, war das Extrahieren von Daten aus einer anderen JSON-Datei. Ich würde empfehlen, diese Lösung: stackoverflow.com/questions/19758954/…
Ishan Srivastava
Das ist toll. Danke dir.
David Kariuki
17

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.
  • Im Falle eines Fehlers beim Dekodieren json_last_error()kann die genaue Art des Fehlers bestimmt werden.
  • Stellen Sie sicher, dass Sie utf8Inhalte übergeben, da json_decodesonst Fehler auftreten können, und geben Sie einfach einen NULLWert zurück.
Mohd Abdul Mujib
quelle
Nun, vielleicht haben sie die Einfachheit trotzdem nicht gemocht. Sie können immer upvote;)
Mohd Abdul Mujib
1
Wahrscheinlich ist der wahrscheinlichere Grund, dass es bereits beantwortet wurde und es so aussieht, als ob @MohdAbdulMujib nach einer freien Wiederholung ist
Isaac
3
@Isaac Einige Leute sind möglicherweise nicht sehr daran interessiert, das gesamte Handbuch zu lesen, wenn sie nur mit der Verwendung der Funktion beginnen möchten. Andernfalls sollten sie besser das offizielle Dokument lesen. Der springende Punkt bei SO ist die Einfachheit, mit der die Antworten bereitgestellt werden. IMHO
Mohd Abdul Mujib
3
// 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>";
}
Sayeed amin
quelle
1

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
Kankatala Krishna
quelle
0

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.

Paul Burilichev
quelle
-1

Ich habe ein Paket namens JSON( GitHub , Packagist ) geschrieben. Wenn Sie den Aufwand für die Verwendung von json_*Funktionen vermeiden möchten , sollten Sie es versuchen.

Beispiel

use MAChitgarha\Component\JSON;

$jsonStr = <<<JSON
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}
JSON;

// Create an instance
$json = new JSON($jsonStr);

// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles

// Iterate over an element
foreach ($json->iterate("toppings") as $item)
    echo "{$item->id}: {$item->type}", PHP_EOL;

// Change an element
$json->set("toppings.3", [
    "id" => "5000",
    "type" => "Unknown"
]);

// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();

Sehen Sie sich das Wiki oder das kurze Tutorial an, um sich damit vertraut zu machen.

Wenn Sie JSON-Dateien lesen und deren Daten extrahieren möchten (anscheinend versuchen Sie dies auszuführen), lesen Sie das JSONFile- Paket, das ich ebenfalls geschrieben habe.

MAChitgarha
quelle
-2

https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w

Überprüfen Sie den folgenden Code zum Konvertieren von json in Array in PHP. Wenn JSON korrekt ist, json_decode()funktioniert es gut und gibt ein Array zurück. Wenn JSON jedoch fehlerhaft 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 fehlerhaft 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 fehlerhaft 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 Ihrer Anforderung,

Harish Sharma
quelle