处理备用API响应类型(typeMismatch)

问题描述 投票:0回答:1

我有一个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

这里有解决方案吗?

谢谢!

ios swift codable jsondecoder
1个回答
0
投票

您可以通过重写/实现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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.