如何在天气中查找以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结构更改或缺少您期望在那里的值。