我目前正在学习Swift,并且我正在尝试进行一个可以发送两个不同响应的api调用:
第一个是:
{
"data": {
"id": 1
},
"error": null
}
第二个是:
{
"data": null,
"error": " Password not matching"
}
因此,在第一个json中,数据是一个嵌套容器,在第二个json中,数据不是嵌套容器。
到目前为止,我有以下内容,在第一种情况下效果很好,但是我不知道如何更改结构以处理第二种情况。任何点击/想法将不胜感激:
struct ApiData {
let userID: Int?
let error: String?
}
extension ApiData: Decodable{
enum CodingKeys: String, CodingKey {
case data = "data"
case userId = "id"
case error = "error"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
do {
let data = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .data)
let userId = try data.decode(Int.self, forKey: .userId)
self.init(userID: nil, error: nil)
} catch let error {
print(error)
throw error
}
}
}
如果我尝试在do块中解码错误情况,则在收到第一种类型的响应时,将抛出“数据格式不正确的错误”。
答案 0 :(得分:1)
data
是可以为零的对象。您缺少data
的可选属性,而userId
(id
)的属性应该是data
的属性。
struct ApiData: Decodable {
let data: DataObject?
let error: String?
}
您也没有data
的结构
struct DataObject: Decodable {
let userId: Int
enum CodingKeys: String, CodingKey {
case userId = "id"
}
}
注意:您不必为CodingKeys
使用ApiData
,只需为DataObject
使用