【发布时间】:2018-06-01 18:41:45
【问题描述】:
我有一个可解码的类:
struct AuthenticationResponse : Decodable {
var status: String
var error: Error
var access_token: String? = ""
var expires_in: Double? = 0
var token_type: String? = ""
var scope: String? = ""
var refresh_token: String? = "
}
struct Error : Decodable {
var desc: String
var code: String
}
在我的错误类中:
要解码到这个类,我有:
URLSession.shared.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in
if let jsonData = data{
let decoder = JSONDecoder()
print("hey")
print("response: \(String(data:jsonData, encoding:.utf8))")
completion(try! decoder.decode(AuthenticationResponse.self, from: jsonData))
}
}.resume()
由于我收到的一些响应是(成功响应):
{
“status”: “SUCCESS” “error”: null, "access_token":
"MWVmOWQxMDYwMjQyNDQ4NzQyNTdkZjQ3NmI4YmVjMGZjZGM5N2IyZmNkOTA1 N2M0NDUzODEwYjM5ZWQyNGNkZg",
"expires_in": 3600, "token_type": "bearer", "scope": null,
"refresh_token":
"ZGEwOGZiOWZhMzhhYjBmMzAyOGRmZTA5NjJhMjY2MTk3YzMyMmE1ZDlkNWI2N mJjYmIxMjNkMjE1NWFhNWY0Mg"
}
然后一个失败的响应只包含一个错误对象,其中包含 desc 和代码。
我想要实现的是一个适用于两种情况的可解码类(当响应成功和失败时)但是我不知道如何实现这一点。我知道我可以制作 2 个单独的可解码类,但这会使事情变得更加混乱,因为我必须确定响应是否是错误并填充以返回不同的类。
有谁知道我应该如何做到这一点>
【问题讨论】:
-
不幸的是,您根本不清楚您要做什么。在您的示例中,您已经有两个可解码的类,您想按原样使用它们吗?在这种情况下,如果解码失败或类似情况,您可能必须创建自己的
AuthenticationResponse-object,其中包含Error。 -
如果你想获得响应的可能性,你应该定义一些
Response协议,但你可能已经知道了。请更具体地说明您预期解决方案的所需属性。 -
我基本上想要一个允许将 JSON 解码为它的类。 AuthenticationResponse 有效,但是当没有返回错误时(成功响应)但是当返回错误时(失败响应)我得到一个错误,这是因为从失败响应返回的 JSON 包含最少的数据并且显然没有正确映射到 AuthenticateResponse 正确@Patru
-
如果您的问题是返回错误,那么您应该不惜一切代价发布产生错误的
JSON,并尽可能具体地说明您收到的错误。可能JSONDecoder不会对他得到的东西感到满意,您将不得不在某些点上添加选项。