如何在天气中查找以json数据格式存储的特定信息API
问题描述:
我在写一个Swift项目来从天气API Wunderground获取天气数据。现在我可以提取诸如温度或相对湿度等信息,但是我很难用swift获取存储在嵌套列表内部列表中的信息。例如,我无法获取存储在“current_observation”中的“display_location.state”的信息。如何在天气中查找以json数据格式存储的特定信息API
这里是由Wunderground提供的天气信息的一个例子:
{
"response": {
"version":"0.1",
"termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
"features": {
"conditions": 1
}
}
, "current_observation": {
"image": {
"url":"http://icons.wxug.com/graphics/wu2/logo_130x80.png",
"title":"Weather Underground",
"link":"http://www.wunderground.com"
},
"display_location": {
"full":"San Francisco, CA",
"city":"San Francisco",
"state":"CA",
"state_name":"California",
"country":"US",
"country_iso3166":"US",
"zip":"94101",
"magic":"1",
"wmo":"99999",
"latitude":"37.77500916",
"longitude":"-122.41825867",
"elevation":"47.00000000"
},
"temperature_string":"76.3 F (24.6 C)",
"relative_humidity":"43%",
}
}
这是我在提取气象信息斯威夫特代码:
var url = NSURL(string:"http://api.wunderground.com/api/56968011acc3e3eb/conditions/q/\(state)/\(city).json")
var data = NSData.dataWithContentsOfURL(url, options: NSDataReadingOptions.DataReadingUncached, error: nil)
var str = NSString(data:data, encoding:NSUTF8StringEncoding)
var json:AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: nil)
var weatherInfo:AnyObject! = json.objectForKey("current_observation")
var currentTemp: AnyObject! = weatherInfo.objectForKey("temperature_string")
var humidity:AnyObject! = weatherInfo.objectForKey("relative_humidity")
var wind:AnyObject! = weatherInfo.objectForKey("wind_kph")
display.text = "Temperature: \(currentTemp)\nHumidity: \(humidity)\nWind: \(wind)\n"
谢谢!
答
有关样式的快速注释,任何时候在第一次设置变量后都不会更改变量的值时,应该使用let
而不是var
。
唯一看起来不正确的是如何将子对象拉出JSON。请记住,在JSON数据结构是这样的
NSDictionary {
"response": NSDictionary {},
"current_observation": NSDictionary {
"relative_humidity": NSString
...
}
...
}
所以,当你拉的对象,如current_observation
了,你需要确保你投的东西到合适的对象
let json = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.AllowFragments, error:nil) as NSDictionary
let weatherInfo = json["current_observation"] as NSDictionary
let currentTemp = weatherInfo["temperature_string"] as NSString
...
尽管完全诚实,但对于这样的事情,我会推荐使用EasyMapping。然后,你可以设置快捷类来表示JSON和地图提供商所以你可以做这样的事情
if let weatherInfo = EKMapper.objectFromExternalRepresentation(json, withMapping:/*mapping provider*/) {
//do stuff
}
,然后你拥有这一切从JSON反序列化进入迅捷的对象。这也可以防止应用程序崩溃,如果JSON结构更改或缺少您期望在那里的值。