Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在weather API中查找以json数据格式存储的特定信息_Json_Swift_Weather Api - Fatal编程技术网

如何在weather API中查找以json数据格式存储的特定信息

如何在weather API中查找以json数据格式存储的特定信息,json,swift,weather-api,Json,Swift,Weather Api,我正在写一个Swift项目,从一个叫做Wunderground的天气API获取天气数据。现在,我可以提取诸如温度或相对湿度之类的信息,但使用swift获取嵌套列表的内部列表中存储的信息时遇到了麻烦。例如,我无法获取“当前观测”中存储的“显示位置.状态”信息 下面是一个由Wunderground提供的天气信息示例: { "response": { "version":"0.1", "termsofService":"http://www.wunderground.com/weather

我正在写一个Swift项目,从一个叫做Wunderground的天气API获取天气数据。现在,我可以提取诸如温度或相对湿度之类的信息,但使用swift获取嵌套列表的内部列表中存储的信息时遇到了麻烦。例如,我无法获取“当前观测”中存储的“显示位置.状态”信息

下面是一个由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"

谢谢大家!

关于样式的简要说明,在第一次设置变量后不更改变量值的任何时候,都应该使用
let
而不是
var

唯一看起来不正确的是如何从JSON中提取子对象。请记住,JSON中的数据结构如下所示

NSDictionary {
    "response": NSDictionary {},
    "current_observation": NSDictionary {
          "relative_humidity": NSString
          ...
    }
    ...
}
因此,当您拉出对象(如
current\u 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
...
虽然说实话,对于这样的东西,我建议使用。然后,您可以设置swift类来表示JSON,并设置一个映射提供程序,这样您就可以执行以下操作

if let weatherInfo = EKMapper.objectFromExternalRepresentation(json, withMapping:/*mapping provider*/) {
    //do stuff
}
然后将所有内容从JSON反序列化为swift对象。这还可以防止应用程序在JSON结构更改或缺少您期望的值时崩溃