2010-10-27 35 views
26

Intenté solicitar el clima de un servicio web que proporciona datos en el formato JSON. Mi código de solicitud de PHP, que no tuvo éxito fue:Analizando el objeto JSON en PHP usando 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;  

Estos son algunos de los datos que se devolvieron. Algunos de los detalles se han truncado por razones de brevedad, pero está retenido integridad objeto:

{ "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

¿Qué has probado? ¿Qué no funciona? ¿Conoces 'json_decode()'? http://www.php.net/json_Decode –

+1

@Ben Lee, se prefiere que SO responda esas preguntas y por lo tanto reemplaza a Google como la fuente predeterminada para preguntas de desarrollo. [ref meta] (http://meta.stackexchange.com/questions/8724/how-to-deal-with-google-questions) – jball

+0

@jball, solo estaba siendo útil. Pekka ya respondió la pregunta y yo estaba dando seguimiento. No tengo ningún problema con que las personas publiquen preguntas simples sobre SO, y ellos * deberían * obtener una respuesta para ellos. Pero por una pregunta así de simple, casi con certeza obtendrán un resultado más rápido si buscan primero, y no hace daño hacerles saber esto. Leí la publicación en el enlace que proporcionas y estoy de acuerdo con la mayoría, pero tampoco estoy de acuerdo en que SO deba * superceder * google. Creo que deberían usarse en tándem, y creo que ayuda al OP a saber cuándo Google es más efectivo. –

Respuesta

49

Esto parece funcionar:

$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>'; 
} 

Si ajusta el segundo parámetro de json_decode a verdadero, se obtiene una matriz, por lo que no puede utilizar el - sintaxis>. También le sugiero que instale el JSONview Firefox extension, para que pueda ver los documentos json generados en una bonita vista de árbol con formato similar a la forma en que Firefox muestra las estructuras XML. Esto hace las cosas mucho más fáciles.

+0

Tenía un JSON profundamente anidado similar que me estaba matando una vez que lo convertí en una matriz. No pude encontrar la manera adecuada de profundizar en el conjunto para llegar al elemento que necesitaba. Parece fácil, pero como alguien bastante nuevo en PHP, su solución simple era exactamente lo que necesitaba. ¡Gracias! – Scooter

+0

Gracias, funciona para mí –

4

parece que se le olvidó la [ "valor"] o ->value:

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

Si se utiliza el siguiente en su lugar:

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

el verdadero devuelve una matriz en lugar de una objeto.

+3

Muchas gracias, me faltaba el parámetro TRUE –

0

Primero debe asegurarse de que su servidor permita la conexión remota para que la función file_get_contents($url) funcione correctamente, la mayoría de los servidores desactivan esta función por razones de seguridad.

0

Mientras editaba el código (porque OCD leve), noté que el clima también es una lista. Usted debe considerar probablemente algo así como

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

para asegurarse de que está utilizando el weatherIconUrl para la instancia de fecha correcta.