491 Stimmen

Wie kann ich eine JSON-Datei mit PHP parsen?

Ich habe versucht, eine JSON-Datei mit PHP zu parsen. Aber ich stecke jetzt fest.

Dies ist der Inhalt meiner JSON-Datei:

{
    "John": {
        "status":"Wait"
    },
    "Jennifer": {
        "status":"Active"
    },
    "James": {
        "status":"Active",
        "age":56,
        "count":10,
        "progress":0.0029857,
        "bad":0
    }
}

Und das habe ich bis jetzt ausprobiert:

<?php

$string = file_get_contents("/home/michael/test.json");
$json_a = json_decode($string, true);

echo $json_a['John'][status];
echo $json_a['Jennifer'][status];

Aber da ich die Namen nicht kenne (wie 'John' , 'Jennifer' ) und alle verfügbaren Schlüssel und Werte (wie 'age' , 'count' ), denke ich, dass ich eine foreach-Schleife erstellen muss.

Ich wäre dankbar für ein Beispiel dafür.

65 Stimmen

Sie sind auf dem richtigen Weg. Schlagen Sie die Syntax für foreach nach (Sie sollten Schlüssel und Werte erhalten). Geben Sie noch nicht auf!

11 Stimmen

@Stefan Mai: foreach($variable as $key => $val) sollte das sein, was Sie wollen :-)

6 Stimmen

@JamWaffles Haha, danke. Ich hatte gehofft, dass OP ein paar Erfahrungen beim Nachschlagen sammeln könnte. Upvotes, weil das wirklich alles ist, was er/sie braucht.

355voto

Gordon Punkte 304254

Um über ein mehrdimensionales Array zu iterieren, können Sie RekursiverArrayIterator

$jsonIterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($json, TRUE)),
    RecursiveIteratorIterator::SELF_FIRST);

foreach ($jsonIterator as $key => $val) {
    if(is_array($val)) {
        echo "$key:\n";
    } else {
        echo "$key => $val\n";
    }
}

Ausgabe:

John:
status => Wait
Jennifer:
status => Active
James:
status => Active
age => 56
count => 10
progress => 0.0029857
bad => 0

auf Codepad ausführen

13 Stimmen

Bietet dieser Ansatz einen besonderen Vorteil gegenüber dem guten alten foreach?

20 Stimmen

@Álvaro natürlich. Mit foreach kann man nur eine Ebene in der Tiefe rekursieren. Mit dem obigen Ansatz können Sie über ein mehrstufiges Array rekursieren. Außerdem ist die ganze Sache in OOP gekapselt, so dass Sie eine bessere Wiederverwendung haben und Sie können es leicht in UnitTests mocken und Sie können Iteratoren mit anderen Iteratoren stapeln, die verschiedene Dinge tun, wie Begrenzung, Zwischenspeicherung, Filterung und so weiter zusätzlich zu allen benutzerdefinierten Iteratoren, die Sie erstellen möchten.

0 Stimmen

Gut, ich hatte nicht bedacht, dass die Verschachtelungsebene variabel ist. In diesem Fall ist dies sauberer als eine rekursive Funktion.

165voto

BoltClock Punkte 660640

Ich kann nicht glauben, dass so viele Leute Antworten posten, ohne das JSON richtig zu lesen.

Wenn Sie foreach iterieren $json_a allein, haben Sie ein Objekt der Objekte. Auch wenn Sie in true als zweiten Parameter haben Sie ein zweidimensionales Array. Wenn Sie die erste Dimension in einer Schleife durchlaufen, können Sie die zweite Dimension nicht einfach auf diese Weise ausgeben. Das ist also falsch:

foreach ($json_a as $k => $v) {
   echo $k, ' : ', $v;
}

So können Sie den Status der einzelnen Personen wiedergeben:

<?php

$string = file_get_contents("/home/michael/test.json");
if ($string === false) {
    // deal with error...
}

$json_a = json_decode($string, true);
if ($json_a === null) {
    // deal with error...
}

foreach ($json_a as $person_name => $person_a) {
    echo $person_a['status'];
}

?>

7 Stimmen

Wenn sich die php- und json-Dateien im selben Verzeichnis befinden, können wir json lesen mit file_get_contents("test.json"); (Sie brauchen den Pfad nicht anzugeben).

2 Stimmen

@Chetabahana Das ist eigentlich nicht richtig. Wenn Sie einen relativen Pfad verwenden wie test.json dann wird der Pfad relativ zum aktuellen Verzeichnis ausgewertet, nicht unbedingt zum PHP-Skript. Unter Bash können Sie das aktuelle Verzeichnis ermitteln, indem Sie pwd .

0 Stimmen

@Flimm Wenn PHP und JSON im selben Verzeichnis ausgeführt werden, ist es nicht erforderlich, den absoluten Pfad der JSON-Datei anzugeben. Korrekt?

62voto

swift Punkte 1090

Die eleganteste Lösung:

$shipments = json_decode(file_get_contents("shipments.js"), true);
print_r($shipments);

Beachten Sie, dass die json-Datei in UTF-8 ohne BOM kodiert sein muss. Wenn die Datei BOM enthält, gibt json_decode NULL zurück.

Alternativ dazu:

$shipments = json_encode(json_decode(file_get_contents("shipments.js"), true));
echo $shipments;

7 Stimmen

Ziemlich genial, aber die ganze Bill Of Materials (BOM) Sache hat mich total verwirrt. äh... wovon reden Sie? Bin ich der einzige, der sich über die mysteriösen, unerklärlichen Abkürzungen aufregt? Abkürzungen sind in Ordnung, aber erklären Sie bitte "When First Used" (WFU)... danke.

9 Stimmen

BOM = Byte Order Mark.

3 Stimmen

de.wikipedia.org/wiki/Byte_order_mark Typisches Problem, wenn Sie mit json auf Mac und PC arbeiten, da sie unterschiedliche Standardtextformate verwenden.

42voto

Thariama Punkte 48880

Versuchen Sie

<?php
$string = file_get_contents("/home/michael/test.json");
$json_a = json_decode($string,true);

foreach ($json_a as $key => $value){
  echo  $key . ':' . $value;
}
?>

6 Stimmen

Versuchen Sie dies Antworten auf StackOverflow sind von geringem Wert, da sie nur wenig dazu beitragen, den OP und künftige Forscher weiterzubilden. Wenn Sie diese Antwort auf der Seite lassen wollen, erklären Sie bitte, wie Ihre Antwort funktioniert und warum sie ratsam ist.

0 Stimmen

Wie die Antwort von BoltClock beweist, ist diese Antwort für die Beispieldaten der Frage falsch.

0 Stimmen

Wie wird das verschachtelte Multi-Dim-Array durchlaufen?

20voto

David Punkte 1148

Es ist mir völlig unverständlich, dass niemand darauf hingewiesen hat, dass Ihre einleitenden "Tags" falsch sind. Sie erstellen ein Objekt mit {}, während Sie ein Array mit [] erstellen könnten.

[ // <-- Note that I changed this
    {
        "name" : "john", // And moved the name here.
        "status":"Wait"
    },
    {
        "name" : "Jennifer",
        "status":"Active"
    },
    {
        "name" : "James",
        "status":"Active",
        "age":56,
        "count":10,
        "progress":0.0029857,
        "bad":0
    }
] // <-- And this.

Mit dieser Änderung wird das json als Array anstelle eines Objekts geparst. Und mit diesem Array können Sie tun, was Sie wollen, wie Schleifen usw.

0 Stimmen

Sie haben Recht, wenn Sie auf die Array-Sache hinweisen.

0 Stimmen

Oh, meine. Ich sollte hinzufügen, dass Sie scheinen den Schlüssel in der OP json während der Konvertierung in Array entfernt haben. Also der OP ist richtig.

0 Stimmen

"Aber weil ich die Namen (wie John, Jennifer) und alle verfügbaren Schlüssel nicht kenne". Er scheint die Schlüssel nicht zu kennen, so dass die einzige Möglichkeit, die Sammlung zu durchlaufen, eine Schleife ist. Das sagt mir, dass er keinen direkten Zugriff auf die Werte nach Schlüssel hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X