我正在使用通用编码来传递网络响应。我创建了下面的函数,该函数解码数据并返回结果:
以下是该功能的一部分:
guard let jsonDataUnwrapped = jsonData,
let result: ServerResponse<T> = try? JSONDecoder().decode(ServerResponse<T>.self, from: jsonDataUnwrapped) else {
completionHandler(.error(APIError.init(type: .parsingError)))
return
}
ServerResponse中的代码:
struct ServerResponse<T: Codable> : Codable {
var response: T
var errors: [ServerError]
}
struct ServerError : Codable {
var code: Int
var message: String
}
在可编码类中,我正在这样做:
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
email = try values.decodeIfPresent(String.self, forKey: .email)
firstName = try values.decodeIfPresent(String.self, forKey: .firstName)
lastName = try values.decodeIfPresent(String.self, forKey: .lastName)
phoneNumber = try values.decode(String.self, forKey: .phoneNumber)
if let status = try values.decodeIfPresent(String.self, forKey: .accountStatus) {
accountStatus = UserStatus(rawValue: status)!
}
}
当我在响应键中获取数据时,此代码可以正常工作。但是在某些情况下,我也会得到空的响应密钥并出现一些错误:
{
"response": {},
"errors": [
{
"code": "104",
"message": "Authentication failed"
}
]
}
当我收到空响应时,我需要错误数组,但我无法获取。
答案 0 :(得分:1)
如果您还添加了所收到的错误消息,那将非常有帮助,但是查看代码很明显
打算对Int进行解码,但是找到了一个字符串/数据。
在JSON中,双引号中的所有内容都是String
甚至"104"
或"false"
struct ServerError : Codable {
let code: String
let message: String
}
这与问题无关,但是将结构成员声明为常量(let
),因为您不会对其进行突变。