处理备用API响应类型(类型不匹配)



我有一个API,它通常会返回这样的响应:

{
"http_status": 200,
"error": false,
"message": "Success.",
"data": {
...
}
}

然而,当请求中出现错误时,响应如下:

{
"http_status": 409,
"error": true,
"message": "error message here",
"data": []
}

当我在此结构上使用let decodedResponse = try JSONDecoder().decode(APIResponse.self, from: data)时:

struct APIResponse: Codable {
var http_status: Int
var error: Bool
var message: String
var data: APIData?
}

在发生错误的情况下,我得到的回复是:

Expected to decode Dictionary<String, Any> but found an array instead

我希望数据是解码对象中的nil

这里有什么解决方案吗?

谢谢!

您可以通过重写/实现init(from decoder: Decoder) throws {来自定义JSON响应的解码方式

struct APIResponse: Codable {
enum CodingKeys: String, CodingKey {
// I'd rename this to conform to standard Swift conventions
// but for example...
case http_status = "http_status"
case error = "error"
case message = "message"
case data = "data"
}

var http_status: Int
var error: Bool
var message: String
var data: APIData?
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
http_status = try container.decode(Int.self, forKey: .http_status)
error = try container.decode(Bool.self, forKey: .error)
message = try container.decode(String.self, forKey: .message)
guard !error else { return }
data = try container.decode(APIData.self, forKey: .data)
}
}

最新更新