J'ai essayé de demander la météo à un service Web fournissant des données au format JSON
. Mon code de demande PHP, qui n'a pas abouti, était le suivant:
$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;
Voici certaines des données qui ont été renvoyées. Certains détails ont été tronqués par souci de brièveté, mais l'intégrité de l'objet est conservée:
{ "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",
... },
... ]
}
}
}
Cela semble fonctionner:
$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 vous définissez le second paramètre de json_decode sur true, vous obtenez un tableau, vous ne pouvez donc pas utiliser la syntaxe ->. Je vous suggérerais également d'installer l'extension JSONview Firefox afin de pouvoir afficher les documents JSON générés dans une arborescence Nice formatée similaire à la manière dont Firefox affiche les structures XML. Cela rend les choses beaucoup plus faciles.
Si vous utilisez plutôt ce qui suit:
$json = file_get_contents($url);
$data = json_decode($json, TRUE);
TRUE renvoie un tableau au lieu d'un objet.
Essayez cet exemple
$json = '{"foo-bar": 12345}';
$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345
http://php.net/manual/en/function.json-decode.php
NB - deux négatifs font un positif. :)
On dirait que vous avez oublié le ["valeur"] ou ->value
:
echo $data[0]->weather->weatherIconUrl[0]->value;
Lors de la modification du code (en raison d'un léger TOC), j'ai remarqué que la météo était aussi une liste. Vous devriez probablement envisager quelque chose comme
echo $data[0]->weather[0]->weatherIconUrl[0]->value;
pour vous assurer que vous utilisez weatherIconUrl pour la bonne instance de date.
Vous devez d'abord vous assurer que votre serveur autorise la connexion à distance afin que la fonction file_get_contents($url)
fonctionne correctement. La plupart des serveurs désactivent cette fonctionnalité pour des raisons de sécurité.