web-dev-qa-db-fra.com

Analyse de l'objet JSON dans PHP en utilisant json_decode

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",
            ... },

          ... ]
        }
    }
}
35
Mark Henry

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. 

60
Max

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.

48
user137621

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. :)

20
zod

On dirait que vous avez oublié le ["valeur"] ou ->value:

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

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.

0
icedwater

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é.

0
user1075784