下面是我试图从Strava API中解析的JSON:
{
"firstname": "Evan",
"lastname": "Arthur",
"city": "",
"state": "",
"country": "",
"sex": "M",
"measurement_preference": "feet",
"ftp": 285,
"bikes": [
{
"id": "b4770368",
"primary": true,
"name": "Felt Disc",
"resource_state": 2,
"distance": 2528687
}
]
}我正在尝试访问一些条目并从它们创建一个对象。这是我的运动员班:
import Foundation
struct athlete: Codable{
let firstName: String
let lastName: String
let sex: String
let measurement: String
enum CodingKeys: String, CodingKey {
case firstName = "firstname"
case lastName = "lastname"
case sex = "sex"
case measurement = "measurement_preference"
case bikes = "bikes"
}
struct Bike: Codable {
let name: String
let distance: String
// enum CodingKeys: String, CodingKey{
// case name = "name"
// case distance = "distance"
// }
}
let bikes: [Bike]
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.firstName = try container.decode(String.self, forKey: .firstName)
self.lastName = try container.decode(String.self, forKey: .lastName)
self.sex = try container.decode(String.self, forKey: .sex)
self.measurement = try container.decode(String.self, forKey: .measurement)
self.bikes = try container.decode([Bike].self, forKey: .bikes)
}
}我试图用以下代码解析它:
let decoder = JSONDecoder()
let definition = try? decoder.decode(athlete.self, from: jsonData)我知道我正在正确地检索api,并且我可以访问“自行车”之前的所有字段,但我不能访问自行车。使用此代码,decoder.decode()将失败。如何正确访问数组并对其进行解码?
发布于 2018-09-24 23:39:30
除了一件事外,您的代码都很好。在你的自行车宣言中,改变
let distance: String至
let distance: Int好吧,既然我已经说了,我要带你去任务。你的最后一行是:
let definition = try? decoder.decode(athlete.self, from: jsonData)那真是太愚蠢了。此方法返回一个错误,告诉您问题是什么,而您正在抛出该错误!要么将try?更改为try!以强制发生将在控制台中记录错误的崩溃,要么将其更改为try,并将整个过程包装在try/catch博客中并自己记录:
do {
let definition = try decoder.decode(athlete.self, from: jsonData)
} catch {
print(error)
}所以我才知道你犯了什么错。不是因为我聪明。不是因为我有锐利的眼睛。都不是真的!这是因为我记录了错误,而不是像你那样扔掉它。如果你这么做了,你一开始就不需要问这个问题了。
https://stackoverflow.com/questions/52488561
复制相似问题