2010-10-27 20 views
26

Próbowałem zażądać pogody z usługi internetowej dostarczającej dane w formacie JSON. Mój kod żądania PHP, który się nie powiódł:Parsowanie obiektu JSON w PHP przy użyciu json_decode

$url="http://www.worldweatheronline.com/feed/weather.ashx?q=schruns,austria&format=json&num_of_days=5&key=8f2d1ea151085304102710"; 
$json = file_get_contents($url); 
$data = json_decode($json, TRUE); 
echo $data[0]->weather->weatherIconUrl[0]->value;  

To niektóre z zwróconych danych. Niektóre szczegóły zostały obcięte dla zwięzłości, ale jest zachowana integralność obiektu:

{ "data": 
    { "current_condition": 
     [ { "cloudcover": "31", 
      ... } ], 
     "request": 
     [ { "query": "Schruns, Austria", 
      "type": "City" } ], 
     "weather": 
     [ { "date": "2010-10-27", 
      "precipMM": "0.0", 
      "tempMaxC": "3", 
      "tempMaxF": "38", 
      "tempMinC": "-13", 
      "tempMinF": "9", 
      "weatherCode": "113", 
      "weatherDesc": [ {"value": "Sunny" } ], 
      "weatherIconUrl": [ {"value": "http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png" } ], 
      "winddir16Point": "N", 
      "winddirDegree": "356", 
      "winddirection": "N", 
      "windspeedKmph": "5", 
      "windspeedMiles": "3" }, 
      { "date": "2010-10-28", 
      ... }, 

      ... ] 
     } 
    } 
} 
+11

Co próbowaliście? Co nie działa? Czy wiesz o 'json_decode()'? http://www.php.net/json_Decode –

+1

@Ben Lee, preferowane jest, aby SO odpowiadał na te pytania i dlatego zastępuje Google'a jako domyślne źródło pytań dla programistów. [ref meta] (http://meta.stackexchange.com/questions/8724/how-to-deal-with-google-questions) – jball

+0

@jball, byłem po prostu pomocny. Pekka już odpowiedział na to pytanie, a ja kontynuowałem. Nie mam problemu z publikowaniem prostych pytań na temat SO, a oni * powinni * uzyskać na nie odpowiedź. Ale na pytanie tak proste, prawie na pewno uzyskają wynik szybciej, jeśli najpierw szukają - i nie zaszkodzi im to powiadomić. Przeczytałem post w linku, który podasz i zgadzam się z większością tego, ale nie zgadzam się również z tym, że SO powinno * zastępować * google. Sądzę, że powinny być używane w tandemie i myślę, że pomaga OP wiedzieć, kiedy Google jest najbardziej skuteczny. –

Odpowiedz

49

To wydaje się działać:

$url = 'http://www.worldweatheronline.com/feed/weather.ashx?q=schruns,austria&format=json&num_of_days=5&key=8f2d1ea151085304102710%22'; 
$content = file_get_contents($url); 
$json = json_decode($content, true); 

foreach($json['data']['weather'] as $item) { 
    print $item['date']; 
    print ' - '; 
    print $item['weatherDesc'][0]['value']; 
    print ' - '; 
    print '<img src="' . $item['weatherIconUrl'][0]['value'] . '" border="0" alt="" />'; 
    print '<br>'; 
} 

Jeśli ustawisz drugi parametr json_decode true, można uzyskać tablicę, więc nie można użyć - składni>. Proponowałbym również zainstalowanie JSONview Firefox extension, aby można było przeglądać wygenerowane dokumenty JSON w ładnym sformatowanym widoku drzewa, podobnie jak Firefox wyświetla struktury XML. To znacznie ułatwia sprawę.

+0

Miałem podobny, głęboko zagnieżdżony json, który zabijał mnie, gdy przekonałem go do tablicy. Nie mogłem wymyślić właściwego sposobu przejścia przez tablicę, aby dostać się do pozycji, której potrzebowałem. Wydaje się łatwe, ale jako ktoś całkiem nowy w php, twoje proste rozwiązanie było dokładnie tym, czego potrzebowałem. Dzięki! – Scooter

+0

Dziękuję, że to działa dla mnie –

4

Wygląda jakbyś zapomniał [ "wartość"] lub ->value:

echo $data[0]->weather->weatherIconUrl[0]->value; 
45

Jeśli zamiast używać następujących:

$json = file_get_contents($url); 
$data = json_decode($json, TRUE); 

TRUE zwraca tablicę zamiast obiekt.

+3

Dziękuję bardzo, brakowało mi parametru PRAWDZIWY –

0

Musisz najpierw upewnić się, że twój serwer pozwala na zdalne połączenie, dzięki czemu funkcja file_get_contents($url) działa dobrze, większość serwerów wyłącza tę funkcję ze względów bezpieczeństwa.

0

Podczas edycji kodu (z powodu łagodnego OCD) zauważyłem, że pogoda również jest listą. Powinieneś prawdopodobnie rozważyć coś takiego jak

echo $data[0]->weather[0]->weatherIconUrl[0]->value; 
, aby uzyskać poprawną datę wystąpienia.

Powiązane problemy