使用json_decodeparsingPHP中的JSON对象

我试图从一个以JSON格式提供数据的Web服务请求天气。 我的PHP请求代码没有成功:

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

这是返回的一些数据。 为简洁起见,一些细节已被截断,但仍保留了对象完整性:

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

这似乎工作:

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

如果将json_decode的第二个参数设置为true,则会得到一个数组,因此不能使用 – >语法。 我还build议你安装JSONview Firefox扩展 ,这样你就可以在类似于 Firefox显示XML结构的格式树视图中查看生成的json文档。 这使事情变得更容易。

如果您使用以下代替:

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

TRUE返回一个数组而不是一个对象。

试试这个例子

 $json = '{"foo-bar": 12345}'; $obj = json_decode($json); print $obj->{'foo-bar'}; // 12345 

http://php.net/manual/en/function.json-decode.php

注意 – 两个否定结果是肯定的。 🙂

好像你忘了[“价值”]->value

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

您必须首先确保您的服务器允许远程连接,以便函数file_get_contents($url)正常工作,大多数服务器由于安全原因禁用此function。

在编辑代码时(因为温和的OCD),我注意到天气也是一个列表。 你应该考虑类似的东西

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

以确保您正在使用weatherIconUrl正确的date实例。