所以我有一个API路由,该路由返回一个JSON对象数组。例如:
[
{"firstname": "Tom", "lastname": "Smith", "age": 31},
{"firstname": "Bob", "lastname": "Smith", "age": 28}
]
我正在尝试设想如何使用Swift中的新可编码功能将它们转换为类中的两个对象。因此,如果我有一个可编码的人员类,我想接受该响应并将它给我两个人对象。
我还使用Alamofire处理请求。
我怎样才能做到这一点?到目前为止,我所看到的与可编码内容相关的所有内容都只允许1个对象。而且我还没有看到与Alamofire或Web框架的任何集成。
有关Alamofire 5的更新:responseJSONDecodable
。
struct Person: Codable {
let firstName, lastName: String
let age: Int
enum CodingKeys : String, CodingKey {
case firstName = "firstname"
case lastName = "lastname"
case age
}
}
Alamofire.request(request).responseJSONDecodable { (response: DataResponse<Person>) in
print(response)
}
Alamofire 4目前不会添加Codable支持(请参阅#2177),您可以改用以下扩展名:https : //github.com/Otbivnoe/CodableAlamofire。
let jsonData = """
[
{"firstname": "Tom", "lastname": "Smith", "age": 31},
{"firstname": "Bob", "lastname": "Smith", "age": 28}
]
""".data(using: .utf8)!
struct Person: Codable {
let firstName, lastName: String
let age: Int
enum CodingKeys : String, CodingKey {
case firstName = "firstname"
case lastName = "lastname"
case age
}
}
let decoded = try! JSONDecoder().decode([Person].self, from: jsonData)
样本:http://swift.sandbox.bluemix.net/#/repl/59a4b4fad129044611590820
使用CodableAlamofire:
let decoder = JSONDecoder()
Alamofire.request(url).responseDecodableObject(keyPath: nil, decoder: decoder) { (response: DataResponse<[Person]>) in
let persons = response.result.value
print(persons)
}
keypath
对应于结果包含在JSON结构中的路径。例如:
{
"result": {
"persons": [
{"firstname": "Tom", "lastname": "Smith", "age": 31},
{"firstname": "Bob", "lastname": "Smith", "age": 28}
]
}
}
keypath
=> results.persons
[
{"firstname": "Tom", "lastname": "Smith", "age": 31},
{"firstname": "Bob", "lastname": "Smith", "age": 28}
]
keypath
=> nil
(空keypath
引发异常)
非常详细的答案。非常感谢你。现在没有足够的时间仔细阅读所有内容,但是会在某个时候完成。非常感谢!!!
答案使用Alamofire 5代码更新(无需扩展)