我尝试通过提供JSON
格式数据的网络服务请求天气。我的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",
... },
... ]
}
}
}
答案 0 :(得分:61)
这似乎有效:
$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,则会得到一个数组,因此您无法使用 - &gt;句法。我还建议您安装JSONview Firefox extension,这样您就可以在一个漂亮的格式化树视图中查看生成的json文档,类似于Firefox显示XML结构的方式。这使事情变得容易多了。
答案 1 :(得分:49)
如果您使用以下内容:
$json = file_get_contents($url);
$data = json_decode($json, TRUE);
TRUE返回一个数组而不是一个对象。
答案 2 :(得分:20)
试试这个例子
$json = '{"foo-bar": 12345}';
$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345
NB - 两个否定因素是积极的。 :)
答案 3 :(得分:4)
好像你忘记了 [“值”] 或->value
:
echo $data[0]->weather->weatherIconUrl[0]->value;
答案 4 :(得分:0)
您必须首先确保您的服务器允许远程连接,以便函数file_get_contents($url)
正常工作,大多数服务器出于安全原因禁用此功能。
答案 5 :(得分:0)
在编辑代码时(因为温和的OCD),我注意到天气也是一个列表。你应该考虑像
这样的东西echo $data[0]->weather[0]->weatherIconUrl[0]->value;
确保您使用weatherIconUrl作为正确的日期实例。
答案 6 :(得分:0)
当您进行json解码时,强制其返回一个数组而不是对象。
$data = json_decode($json, TRUE); -> // TRUE
这将返回一个数组,您可以通过提供键来访问值。