当它在 而不是 [] 中时,我如何从 api 中获取东西
Posted
技术标签:
【中文标题】当它在 而不是 [] 中时,我如何从 api 中获取东西【英文标题】:How do I grab stuff from the api when it's in not []当它在 而不是 [] 中时,我如何从 api 中获取东西 【发布时间】:2019-04-13 18:01:22 【问题描述】:我正在尝试为一个项目制作天气应用程序,并且我正在为我的 api 使用 openweathermap。我让它输出一些信息,但我不知道如何获取其余信息。这就是我将它放入 Postman 时出现的结果。如何获取 中的信息,例如温度以及最低和最高温度?我知道如果它是一个数组,我可以循环它,但它不是。
到目前为止,我已经尝试像数组一样循环遍历它,但没有成功:
if let mainJson = jsonObject["main"] as? [[String:AnyObject]]
for eachtemp in mainJson
if let temp = eachtemp["temp"] as? String
print("the temp is: ", temp)
这是来自 api 的响应:
"coord":
"lon": -88.75,
"lat": 41.93
,
"weather": [
"id": 800,
"main": "Clear",
"description": "clear sky",
"icon": "01d"
],
"base": "stations",
"main":
"temp": 281.24,
"pressure": 1019,
"humidity": 52,
"temp_min": 279.26,
"temp_max": 283.15
,
"visibility": 16093,
"wind":
"speed": 7.7,
"deg": 280,
"gust": 11.3
,
"clouds":
"all": 1
,
"dt": 1555176309,
"sys":
"type": 1,
"id": 5706,
"message": 0.0073,
"country": "US",
"sunrise": 1555154275,
"sunset": 1555201965
,
"id": 420012399,
"name": "Aurora",
"cod": 200
【问题讨论】:
字典与数组。 解析您的数据。不要只使用原始字典。你让自己很难受。比如看***.com/questions/53687617/… 请search。有很多相关的问题。并使用Codable
【参考方案1】:
是一个字典(Swift type
[String:Any]
, never [String:AnyObject]
),你必须通过key订阅获取每个值,所有请求的值都是Double
if let main = jsonObject["main"] as? [String:Any]
let temp = main["temp"] as! Double
let tempMin = main["temp_min"] as! Double
let tempMax = main["temp_max"] as! Double
print(temp, tempMin, tempMax)
关于强制解包:openweathermap
发送非常可靠的数据。如果main
存在,那么里面的键也存在
使用Decodable
更容易
struct WeatherAPI : Decodable
let main: Main
struct Main : Decodable
let temp, tempMin, tempMax : Double
let apiKey = ....
let url = URL(string:"http://api.openweathermap.org/data/2.5/weather?....." + apiKey)!
let task = URLSession.shared.dataTask(with: url) (data, response, error) in
if let error = error print(error); return
do
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let result = try decoder.decode(WeatherAPI.self, from: data!)
print(result.main.temp, result.main.tempMin, result.main.tempMax)
catch
print(error)
task.resume()
【讨论】:
以上是关于当它在 而不是 [] 中时,我如何从 api 中获取东西的主要内容,如果未能解决你的问题,请参考以下文章
当 Recyclerview 在 NestedScrollview 中时,如何避免绑定所有项目?
当它隐藏在另一个片段中时,以编程方式在 CoordinatorLayout 中显示 BottomNavigationView