Swift - 解码无法使用可选值进行解码



我正在尝试向后端发出简单的登录请求。后端返回一个 JSON 对象,其中包含状态代码、每次字符串消息和访问令牌,前提是登录成功。
为此,我创建了以下struct

struct AuthResponse: Decodable {
enum CodingKeys: String, CodingKey {
case code, message
case accessToken = "access_token"
}
let code: Int, message: String, accessToken: String?
}

当登录不成功且服务器未发送访问令牌时,AuthResponse对象会设法正确解码,accessToken属性nil,正如我所期望的那样。例如,解码成功,对于以下响应:

代码 = 400; 消息 ="用户未注册";

但是对于带有访问令牌的响应,如下所示:

"access_token" =访问令牌;
代码 = 200;
消息 ="登录成功";

AuthResponse对象不会无法解码。

为什么会这样?这与accessToken属性是可选的这一事实有关吗?我还尝试覆盖解码初始值设定项并实现decodeIfPresent(_:forKey:)并解开属性,但似乎都没有帮助。
提前谢谢。

代码不能因给定信息而失败。

请在catch块中打印error实例并将其添加到您的问题中。

然而,一个复杂的替代方案 - 没有任何可选 - 是具有关联类型的枚举。它在成功时返回令牌,在失败时返回代码和消息

enum AuthResponse: Decodable {
case success(String), failure(Int, String)
private enum CodingKeys : String, CodingKey { case code, message, accessToken = "access_token" }
init(from decoder : Decoder) throws
{
let container = try decoder.container(keyedBy: CodingKeys.self)
do {
let code = try container.decode(Int.self, forKey: .code)
if code == 200 {
let token = try container.decode(String.self, forKey: .accessToken)
self = .success(token)
} else {
let message = try container.decode(String.self, forKey: .message)
self = .failure(code, message)
}
}
}
}

并使用它

let result = try JSONDecoder().decode(AuthResponse.self, from: data)
switch result {
case .success(let token): print(token)
case .failure(let code, let message): print(code, message)
}

相关内容

  • 没有找到相关文章

最新更新