swift如何查找天气 API 中的 json 数据格式存储的特定信息

标签: json Swift
发布时间: 2017/3/4 20:20:52
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我在写 Swift 项目从天气 API,Wunderground 获取天气数据。现在我可以提取信息,如温度或湿度,但我却有点问题上获取的嵌套的列表使用内部列表中存储的信息 swift 。例如,我不能得到的信息存储在"current_observation"中的"display_location.state"。

这里是由 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%",
    }
}

这里是我 Swift 上天气信息提取的代码︰

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"

谢谢!

解决方法 1:

关于风格的快速说明,您应该使用 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。然后你就可以设置 swift 类来代表 JSON 和地图提供商,所以你可以只是这样做

if let weatherInfo = EKMapper.objectFromExternalRepresentation(json, withMapping:/*mapping provider*/) {
    //do stuff
}

然后你有它所有从成 JSON 反序列化 swift 对象。这也可以防止应用程序崩溃如果 JSON 结构发生变化,或者是缺少的值,你也会这样做。

赞助商