Wie kann ich eine JSON-Datei mit PHP parsen? [duplicate]

Lesezeit: 9 Minuten

Wie kann ich eine JSON Datei mit PHP parsen duplicate
John Doe

Ich habe versucht, eine JSON-Datei mit PHP zu analysieren. 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 bisher probiert:

<?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 (z 'John', 'Jennifer') und alle verfügbaren Schlüssel und Werte (wie 'age', 'count') vorher denke ich, dass ich eine Foreach-Schleife erstellen muss.

Ich würde mich über ein Beispiel dafür freuen.

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

    – Stefan Mai

    3. Dezember 2010 um 8:12 Uhr

  • @ Stefan Mai: foreach($variable as $key => $val) sollte das sein was du willst 🙂

    – Bojangles

    3. Dezember 2010 um 8:15 Uhr

  • @JamWaffles Haha, danke. Ich hatte gehofft, dass OP etwas Erfahrung beim Nachschlagen sammeln könnte. Upvotes, weil es wirklich alles ist, was er/sie braucht.

    – Stefan Mai

    3. Dezember 2010 um 8:16 Uhr

  • Nebenbemerkung: Ich schlage vor, Sie konfigurieren Ihr PHP-Setup so, dass alle Arten von Fehlermeldungen angezeigt werden, einschließlich notices

    – Alvaro González

    3. Dezember 2010 um 8:39 Uhr

  • Können Sie erläutern, was Sie aus dem “Parsen” des JSON herausholen möchten: dh welche Aufgabe versuchen Sie mit Ihrem Code zu erfüllen (wie: “Alle Status ausgeben”, “Namen finden, bei denen der Status xyz ist”, “find alle Informationen für xyz”)?

    – Salat

    3. Dezember 2010 um 10:43 Uhr

1647091449 27 Wie kann ich eine JSON Datei mit PHP parsen duplicate
Gordon

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

$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

laufen auf Codepad

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

    – Alvaro González

    3. Dezember 2010 um 8:32 Uhr

  • @Álvaro offensichtlich. Mit foreach können Sie nur eine Tiefenebene rekursieren. Mit dem obigen Ansatz können Sie über ein mehrstufiges Array rekursieren. Außerdem ist das Ganze in OOP gekapselt, sodass Sie es besser wiederverwenden können und es in UnitTests leicht nachahmen können. Außerdem können Sie Iteratoren mit anderen Iteratoren stapeln, die verschiedene Dinge tun, wie z benutzerdefinierte Iteratoren, die Sie möglicherweise erstellen möchten.

    – Gordon

    3. Dezember 2010 um 8:39 Uhr


  • Okay, ich hatte nicht bedacht, dass die Verschachtelungsebene variabel ist. In einem solchen Fall ist dies sauberer als eine rekursive Funktion.

    – Alvaro González

    3. Dezember 2010 um 9:04 Uhr

  • Diese Stilanalyse hinterlässt jedoch einige Mehrdeutigkeiten. Zum Beispiel {'John':{'status':'waiting', 'Mary':{'status','nested'}}, 'Suzy':{'status:'waiting'} } ist nicht zu unterscheiden von {'John':{'status':'waiting'}, 'Mary':{'status','nested'}, 'Suzy':{'status:'waiting'} }. Dass Mary ist ein strukturelles Kind von John ist verloren.

    – Jesse Chisholm

    29. August 2015 um 23:51 Uhr

  • @ Jesse php.net/manual/en/class.recursiveiteratoriterator.php würde es Ihnen ermöglichen, die Tiefe zu erkennen.

    – Gordon

    30. August 2015 um 7:08 Uhr

Wie kann ich eine JSON Datei mit PHP parsen duplicate
BoltClock

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

Wenn Sie foreach iterieren $json_a allein haben Sie ein Objekt von Objekten. Auch wenn Sie vorbeikommen true Als zweiten Parameter haben Sie ein zweidimensionales Array. Wenn Sie die erste Dimension durchlaufen, können Sie die zweite Dimension nicht einfach so wiederholen. Das ist also falsch:

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

Um den Status jeder Person wiederzugeben, versuchen Sie Folgendes:

<?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'];
}

?>

  • Wenn sich die PHP- und JSON-Dateien im selben Verzeichnis befinden, können wir JSON mit lesen file_get_contents("test.json"); (Keine Notwendigkeit, den Pfad zu setzen).

    – Chetabahana

    16. April 2015 um 9:55 Uhr


  • @Chetabahana Das ist eigentlich nicht richtig. Wenn Sie einen relativen Pfad wie z test.json, dann wird der Pfad relativ zum aktuellen Verzeichnis ausgewertet, nicht unbedingt dort, wo sich das PHP-Skript befindet. Auf Bash können Sie das aktuelle Verzeichnis durch Eingabe von ermitteln pwd.

    – Flimmer

    28. August 2019 um 13:22 Uhr

  • @Flimm Wenn PHP und JSON und die Ausführung im selben Verzeichnis erfolgen, muss der absolute Pfad der JSON-Datei nicht angegeben werden. Richtig?

    – Nguai al

    21. Januar 2021 um 4:33 Uhr

  • @Nguaial Das hängt davon ab, was das aktuelle Arbeitsverzeichnis ist. Angenommen, Sie haben eine PHP-Datei /home/user/project/test.php und eine JSON-Datei /home/user/project/json.json. Wenn Ihre aktuelle Arbeit ist /home/userum dann die PHP-Datei auszuführen, die Sie eingeben würden php project/test.php. In diesem Fall müsste die PHP-Datei auf die JSON-Datei verweisen als project/test.json da relative Pfade relativ zum aktuellen Arbeitsverzeichnis sind, nicht unbedingt zum übergeordneten Verzeichnis der PHP-Datei.

    – Flimmer

    22. Januar 2021 um 14:11 Uhr

1647091450 994 Wie kann ich eine JSON Datei mit PHP parsen duplicate
schnell

Die eleganteste Lösung:

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

Denken Sie daran, dass die json-Datei in UTF-8 ohne BOM codiert werden muss. Wenn die Datei BOM hat, gibt json_decode NULL zurück.

Alternative:

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

  • Ziemlich großartig, aber die ganze Sache mit der Stückliste (BOM) hat mich total verwirrt. äh… wovon redest du? Bin ich der einzige Typ, der sich über die Verwendung mysteriöser, ungeklärter Abkürzungen ärgert? Okay, Abkürzungen zu verwenden, aber bitte erklären Sie When First Used (WFU) … danke.

    – zipzit

    12. Februar 2015 um 1:26 Uhr

  • BOM = Byte Order Mark.

    – schnell

    2. März 2015 um 9:35 Uhr

  • en.wikipedia.org/wiki/Byte_order_mark Typisches Problem, wenn Sie mit json sowohl auf Mac als auch auf PC arbeiten, da sie unterschiedliche Standardtextformate verwenden.

    – schnell

    2. März 2015 um 9:41 Uhr

  • Dieser Beitrag versucht nicht, die gestellte Frage zu beantworten

    – mickmackusa

    28. März 2019 um 12:02 Uhr

Wie kann ich eine JSON Datei mit PHP parsen duplicate
Thariama

Versuchen

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

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

1647091451 773 Wie kann ich eine JSON Datei mit PHP parsen duplicate
David

Es ist mir völlig ein Rätsel, dass niemand darauf hingewiesen hat, dass Ihre anfänglichen “Tags” falsch sind. Sie erstellen ein Objekt mit {}, während Sie mit ein Array 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 der JSON als Array statt als Objekt geparst. Und mit diesem Array können Sie machen, was Sie wollen, wie Loops usw.

  • Sie haben recht, wenn Sie auf die Array-Sache hinweisen.

    – Stephen Adelakun

    23. August 2016 um 8:40 Uhr


  • Ach meins. Ich sollte hinzufügen, dass Sie den Schlüssel im json des OP entfernt zu haben scheinen, während Sie in ein Array konvertieren. Also hat der OP recht.

    – Stephen Adelakun

    23. August 2016 um 8:51 Uhr

  • “Aber weil ich die Namen (wie John, Jennifer) und alle verfügbaren Schlüssel nicht kenne”. Er scheint die Schlüssel nicht zu kennen, also ist die einzige Möglichkeit, die Sammlung zu durchqueren, eine Schleife. Diese Art sagt mir, dass er keinen direkten Zugriff auf die Werte per Schlüssel hat.

    – David

    24. August 2016 um 19:25 Uhr

  • Dieser Beitrag beantwortet nicht die Frage, wie man einen JSON-String analysiert und auf Subarray-Elemente von unbekannten Schlüsseln der ersten Ebene zugreift. Dies ist keine Antwort und sollte ein Kommentar unter der Frage sein. Es sieht fast so aus, als würden Sie empfehlen, die Datei zu lesen und dann durch Zeichenfolgenfunktionen nach Ihren Wünschen zu mutieren. Ich verstehe es nicht.

    – mickmackusa

    28. März 2019 um 11:26 Uhr


  • Nein, ich weise darauf hin, dass die Struktur der Datei für den Zweck, den er liest, falsch ist. Und deshalb beantwortet es die Frage. Und es scheint tatsächlich, dass Sie es nicht verstehen, weil ich nichts über String-Funktionen gesagt habe. Das ist einfach albern.

    – David

    2. April 2019 um 11:26 Uhr

1647091452 14 Wie kann ich eine JSON Datei mit PHP parsen duplicate
Däne Brouwer

Versuche dies

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

    $decode_data = json_decode($json_data);
    foreach($decode_data as $key=>$value){

            print_r($value);
    }

  • Sie haben recht, wenn Sie auf die Array-Sache hinweisen.

    – Stephen Adelakun

    23. August 2016 um 8:40 Uhr


  • Ach meins. Ich sollte hinzufügen, dass Sie den Schlüssel im json des OP entfernt zu haben scheinen, während Sie in ein Array konvertieren. Also hat der OP recht.

    – Stephen Adelakun

    23. August 2016 um 8:51 Uhr

  • “Aber weil ich die Namen (wie John, Jennifer) und alle verfügbaren Schlüssel nicht kenne”. Er scheint die Schlüssel nicht zu kennen, also ist die einzige Möglichkeit, die Sammlung zu durchqueren, eine Schleife. Diese Art sagt mir, dass er keinen direkten Zugriff auf die Werte per Schlüssel hat.

    – David

    24. August 2016 um 19:25 Uhr

  • Dieser Beitrag beantwortet nicht die Frage, wie man einen JSON-String analysiert und auf Subarray-Elemente von unbekannten Schlüsseln der ersten Ebene zugreift. Dies ist keine Antwort und sollte ein Kommentar unter der Frage sein. Es sieht fast so aus, als würden Sie empfehlen, die Datei zu lesen und dann durch Zeichenfolgenfunktionen nach Ihren Wünschen zu mutieren. Ich verstehe es nicht.

    – mickmackusa

    28. März 2019 um 11:26 Uhr


  • Nein, ich weise darauf hin, dass die Struktur der Datei für den Zweck, den er liest, falsch ist. Und deshalb beantwortet es die Frage. Und es scheint tatsächlich, dass Sie es nicht verstehen, weil ich nichts über String-Funktionen gesagt habe. Das ist einfach albern.

    – David

    2. April 2019 um 11:26 Uhr

Versuchen:

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

foreach ($json as $key => $value) {
    if (!is_array($value)) {
        echo $key . '=>' . $value . '<br />';
    } else {
        foreach ($value as $key => $val) {
            echo $key . '=>' . $val . '<br />';
        }
    }
}

  • Versuche dies Antworten sind auf StackOverflow von geringem Wert, da sie sehr wenig dazu beitragen, das OP und zukünftige Forscher zu schulen. Wenn Sie diese Antwort auf der Seite belassen, erklären Sie bitte, wie Ihre Antwort funktioniert und warum sie ratsam ist.

    – mickmackusa

    1. September 2018 um 3:46 Uhr

993720cookie-checkWie kann ich eine JSON-Datei mit PHP parsen? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy