Ankündigung

Einklappen
Keine Ankündigung bisher.

JSON-Datei richtig auslesen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • JSON-Datei richtig auslesen

    Hallo zusammen,

    ich weiß einfach nicht, wie ich auf Daten in einer JSON-Datei richtig zugreifen kann. Zum Beispiel so eine Datei hier:

    Code:
    {
       "results" : [
          {
             "address_components" : [
                {
                   "long_name" : "1600",
                   "short_name" : "1600",
                   "types" : [ "street_number" ]
                },
                {
                   "long_name" : "Amphitheatre Pkwy",
                   "short_name" : "Amphitheatre Pkwy",
                   "types" : [ "route" ]
                },
                {
                   "long_name" : "Mountain View",
                   "short_name" : "Mountain View",
                   "types" : [ "locality", "political" ]
                },
                {
                   "long_name" : "Santa Clara",
                   "short_name" : "Santa Clara",
                   "types" : [ "administrative_area_level_2", "political" ]
                },
                {
                   "long_name" : "California",
                   "short_name" : "CA",
                   "types" : [ "administrative_area_level_1", "political" ]
                },
                {
                   "long_name" : "United States",
                   "short_name" : "US",
                   "types" : [ "country", "political" ]
                },
                {
                   "long_name" : "94043",
                   "short_name" : "94043",
                   "types" : [ "postal_code" ]
                }
             ],
             "formatted_address" : "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
             "geometry" : {
                "location" : {
                   "lat" : 37.42291810,
                   "lng" : -122.08542120
                },
                "location_type" : "ROOFTOP",
                "viewport" : {
                   "northeast" : {
                      "lat" : 37.42426708029149,
                      "lng" : -122.0840722197085
                   },
                   "southwest" : {
                      "lat" : 37.42156911970850,
                      "lng" : -122.0867701802915
                   }
                }
             },
             "types" : [ "street_address" ]
          }
       ],
       "status" : "OK"
    }
    Da kann ich mit

    PHP-Code:
    $latitude  $output->results[0]->geometry->location->lat;
    $longitude $output->results[0]->geometry->location->lng
    auf die Werte lat und lng zugreifen.

    Soweit so logisch.

    Aber wie komme ich beispielsweise an den Straßennamen "route" unter "adress-compontents". Mit welchem Befehl, kann ich diese Variable auslesen?

    Danke für Eure Hilfe!

  • #2
    Genauso...
    PHP-Code:
    $sRoute $output->results[0]->address_components[1]->long_name
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Ja, genau das habe ich probiert. Aber leider scheint $sRoute dann leer zu sein.

      Jedenfalls gibt

      echo $latitude; "37.4220033" aus
      echo $longitude; "-122.08542120" aus
      echo $sRoute; aber nix aus

      Daher meine Frage hier... Irgendwas scheint da also nicht zu stimmen?!

      Kommentar


      • #4
        Schonmal versucht zu debuggen?

        PHP-Code:
        var_dump($output->results[0]->address_components[1]->long_name);
        var_dump($output->results[0]->address_components[1]);
        var_dump($output->results[0]->address_components);
        var_dump($output->results[0]);
        var_dump($output->results);
        var_dump($output); 
        [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

        Kommentar


        • #5
          Warum auch immer, aber jetzt liest er den Wert korrekt aus... Danke!

          Noch eine Frage:

          Die JSON-Datei ist die Ausgabe der Google Maps API. Anscheinend ist die Datei nicht immer gleich aufgebaut. Also der Straßenname ist nicht immer der zweite Wert im Array, manchmal auch der erste.

          Was ist eine elegante Möglichkeit, nicht fest "adress_components[1]" abzurufen. Sondern den Arrayeintrag, in dem "types" = "routes" ist? Gibt es da was schnelles/elegantes?

          Kommentar


          • #6
            PHP-Code:
            foreach ( $output->results[0]->address_components as $component ) {
                
                
            $sType end$component->types );

                if ( 
            $sType == 'route' ) {

                    
            var_dump$component->long_name ); 
                    break;

                }


            ...nicht wirklich elegant, sollte aber weiterhelfen.

            ...oder so, das ist etwas wiederverwendbarer:
            PHP-Code:
            $fnGetType = function( $array_data$type ) {
                    return 
            array_filter(
                            
            $array_data,
                            function ( 
            $component ) use ( $type ) {
                                return 
            end$component->types) == $type;
                            }
                        );
                };

            var_dump$fnGetType($output->results[0]->address_components'route') ); 
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar


            • #7
              Suuuper, danke!

              Jetzt noch zwei (hoffentlich) allerletzte Fragen dazu - für mich quasi noch eine Schwierigkeitsstufe höher...

              1) Manche JSON-Dateien habe einige Kategorien doppelt:

              Code:
              {
                 "results" : [
                    {
                       "address_components" : [
                          {
                             "long_name" : "1600",
                             "short_name" : "1600",
                             "types" : [ "street_number" ]
                          },
                          {
                             "long_name" : "Amphitheatre Pkwy",
                             "short_name" : "Amphitheatre Pkwy",
                             "types" : [ "route" ]
                          },
                          {
                             "long_name" : "Mountain View",
                             "short_name" : "Mountain View",
                             "types" : [ "locality", "political" ]
                          },
                          {
                             "long_name" : "Santa Clara",
                             "short_name" : "Santa Clara",
                             "types" : [ "administrative_area_level_2", "political" ]
                          },
                          {
                             "long_name" : "California",
                             "short_name" : "CA",
                             "types" : [ "administrative_area_level_1", "political" ]
                          },
                          {
                             "long_name" : "United States",
                             "short_name" : "US",
                             "types" : [ "country", "political" ]
                          },
                          {
                             "long_name" : "94043",
                             "short_name" : "94043",
                             "types" : [ "postal_code" ]
                          }
                       ],
                       "formatted_address" : "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
                       "geometry" : {
                          "location" : {
                             "lat" : 37.42291810,
                             "lng" : -122.08542120
                          },
                          "location_type" : "ROOFTOP",
                          "viewport" : {
                             "northeast" : {
                                "lat" : 37.42426708029149,
                                "lng" : -122.0840722197085
                             },
                             "southwest" : {
                                "lat" : 37.42156911970850,
                                "lng" : -122.0867701802915
                             }
                          }
                       },
                       "types" : [ "street_address" ]
                    }
                    {
                       "address_components" : [
                          {
                             "long_name" : "1600",
                             "short_name" : "1600",
                             "types" : [ "street_number" ]
                          },
                          {
                             "long_name" : "Amphitheatre Pkwy",
                             "short_name" : "Amphitheatre Pkwy",
                             "types" : [ "route" ]
                          },
                          {
                             "long_name" : "Mountain View",
                             "short_name" : "Mountain View",
                             "types" : [ "locality", "political" ]
                          },
                          {
                             "long_name" : "Santa Clara",
                             "short_name" : "Santa Clara",
                             "types" : [ "administrative_area_level_2", "political" ]
                          },
                          {
                             "long_name" : "California",
                             "short_name" : "CA",
                             "types" : [ "administrative_area_level_1", "political" ]
                          },
                          {
                             "long_name" : "United States",
                             "short_name" : "US",
                             "types" : [ "country", "political" ]
                          },
                          {
                             "long_name" : "94043",
                             "short_name" : "94043",
                             "types" : [ "postal_code" ]
                          }
              
                 ],
                 "status" : "OK"
              }
              Wie sage ich beim Auslesen, ob er die ersten oder die zweiten "adress_components" nehmen soll?

              2) Manche JSON-Dateien haben Überschriften, die von Datei zu Datei unterschiedlich sind - deren Unterpunkte aber identisch sind:

              Code:
               {
                "status": "ok",
                 "body": [
                  {
                    "_id": "70:ee:50:00:58:82",
                    "place": {
                      "location": [
                        2.470299,
                         48.815686
                      ],
                       "altitude":  48.231808,
                       "timezone":  "Europe\/Paris"
                    },
                     "mark":  3,
                     "measures": {
                      "02:00:00:00:5b:be": {
                        "res": {
                          "1382003013": [
                            19.6,
                             70
                          ]
                        },
                         "type": [
                           "temperature",
                           "humidity"
                        ]
                      },
                       "70:ee:50:00:58:82": {
                        "res": {
                          "1382003056": [
                            1021.9
                          ]
                        },
                         "type": [
                          "pressure"
                        ]
                      } 
                    } 
                  },
                   {
                    "_id": "70:ee:50:00:46:04",
                    "place": {
                      "location": [
                        2.4592,
                         48.81418
                      ],
                       "altitude":  42,
                       "timezone":  "Europe\/Paris"
                    },
                     "mark":  14,
                     "measures": {
                      "02:00:00:00:39:e6": {
                        "res": {
                          "1382002618": [
                            15.3,
                             89
                          ]
                        },
                         "type": [
                          "temperature",
                           "humidity"
                        ] 
                      },
                       "70:ee:50:00:46:04": {
                        "res": {
                          "1382002652": [
                            1019.7
                          ]
                        },
                         "type": [
                          "pressure"
                        ]
                      } 
                    } 
                  },
                   
                ],
                 "time_exec":  0.027956008911133,
                 "time_server":  1396885905
              }
              Wie kann ich diese JSON in eine ganz simple Tabelle verwandeln? Ich möchte immer stehen haben "ID: Temperatur, Uhrzeit".

              Den Wert der _id kann ich ja ganz simpel auslesen. Den Wert Temperatur aber schon nicht, weil er verschachtelt steht. Unter "measures", dann einer wechselnden ID ( 02:00:00:00:5b:be ), die ich nicht kenne. Und dann noch in einem Array unter "res", das nach der Uhrzeit benannt ist ( 1382003013 ), die ich zwar auslesen möchte. Aber auch nicht kenne. Ziemlich viele Unbekannte also an dieser Stelle... Wie komme ich an die Daten?

              Kommentar


              • #8
                Sorry, doch nicht die letzte Frage, also mache ich mal weiter...

                3) Die Funktion $fnGetType funktioniert super, aber nur bei "route" und "street_number". Leider nicht, wenn unter TYPES mehrere Items stehen ("locality", "political"), das ist die Stadt. Wie kriege ich das denn hin, dass ich auch nach diesen Werten suchen kann? Oder nach "sublocality", "political" - das ist der Stadtteil.

                4) Das Auslesen der Werte - ob mit $fnGetType oder "$output->results[0]->address_components[0]->long_name" läuft in den meisten Fällen gut (bis auf das Problem in Frage 3), aber bei manchen bleiben alle Werte leer.

                Zum Beispiel bei dieser Google-API-Abfrage hier kommen nur leere Werte heraus beim Auslesen:
                http://maps.googleapis.com/maps/api/...e&language=de"

                Dagegen wirft er hier die Adresse richtig raus:

                http://maps.googleapis.com/maps/api/...se&language=de

                Wieso? Wo liegt hier der Unterschied in den beiden JSON-Dateien?


                Sorry für die ganzen Fragen! Aber habe mich mit dem Auslesen von JSON-Dateien vorher noch nie beschäftigt - und auch kein gutes Tutorial gefunden dazu. Und irgendwie stehe ich daher vor immer neuen Problemen...

                Kommentar


                • #9
                  zu 3: Anstatt end() auf in_array() gehen...

                  Wie sage ich beim Auslesen, ob er die ersten oder die zweiten "adress_components" nehmen soll?
                  Das findest Du raus, Du kennst ja var_dump() bereits und kannst dann sehr schön ableiten.
                  Competence-Center -> Enjoy the Informatrix
                  PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                  Kommentar


                  • #10
                    Hallo Arne,

                    super, danke für die Hilfe! in_array hat wunderbar geklappt.

                    Wo ich leider überhaupt nicht weiterkomme ist bei Frage 2... Habe mir aus dem Netz mal eine Sache mit "RecursiveIteratorIterator" gezogen, aber die funktioniert auch nicht wirklich... Puh, vielleicht bin ich zu blöd... Dafür... Hat jemand einen Idee, wie ich aus der JSON-Datei Frage 2 einfach eine Tabelle mit ID: Temperatur machen kann?

                    Danke!!!

                    Kommentar


                    • #11
                      Du hast einen json-Response, kennst json_decode() und json_encode() oder zumindest die offizielle PHP-Doku, wo man das findet.
                      Nun mußt Du schon mal selbst schauen, wie das zusammengehört und wie Du auf Dein Ergebnis kommst.

                      Solltest Du nicht weiter kommen, fragst Du hier mit den aktuellen Versuchen, die nicht funktioniert haben, gerne wieder...
                      Competence-Center -> Enjoy the Informatrix
                      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                      Kommentar


                      • #12
                        So, ich habe ein bisschen gebastelt und damit läuft es jetzt mit dem Temperaturen auslesen:

                        PHP-Code:
                            $werte $output->body[$i]->measures;

                            foreach (
                        $werte as $key => $value) {
                              
                        $messwerte $value->res;
                              if (
                        $value->type[0] == "temperature") {
                                foreach (
                        $messwerte as $zeit => $ausgabe) {
                                  
                        $temperatur=$ausgabe[0];
                                }
                              }
                            } 
                        Wo ich aber immer noch nicht weiter bin ist mit der Google-Maps-API. Warum werfen manche Orte ein leeren Ergebnis aus, obwohl die JSON-Datei ähnlich aufgebaut ist? (Frage 4)

                        Kommentar


                        • #13
                          Also bei beiden Links zu Frage 4, bekomme ich keine leeren Ergebnisse.
                          Competence-Center -> Enjoy the Informatrix
                          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                          Kommentar


                          • #14
                            Hm, komisch... Also wenn die links im Browser öffne, sehe ich die JSON-Dateien ja auch ganz normal.

                            Aber wenn ich sie mit
                            PHP-Code:
                                  $fnGetType = function( $array_data$type ) {
                                return 
                            array_filter(
                                  
                            $array_data,
                                  function ( 
                            $component ) use ( $type ) {
                                    return 
                            in_array $type$component->types );
                                  }
                                );
                              }; 
                            dursuche, braucht das Laden der Seite super lange - und am Ende steht da nichts...

                            Woran könnte das liegen? Sucht die Funktion eine Typen, der nicht da ist? Wie kann ich das denn verhindern?

                            Kommentar


                            • #15
                              Wie rufst Du das denn auf?
                              Competence-Center -> Enjoy the Informatrix
                              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                              Kommentar

                              Lädt...
                              X