首页 > 解决方案 > 如何在 API 的未指定返回数据中使用可解码

问题描述

当试图解析来自 API 的返回数据时,我得到“无法读取数据,因为它的格式不正确。” 因为回报不一致。

当 logo_url 具有值时,它是一个对象,请参见下面的示例:

"logo_url": {
                    "mime_type": "image/jpeg",
                    "url": "http://google.com"
                },

但是当它没有值时,它返回空数组

"logo_url": [],

这就是为什么我得到“无法读取数据,因为它的格式不正确”的原因。

我的模型

struct Model: Decodable {
    let logo: Logo?

    enum CodingKeys: String, CodingKey {
        case logo = "logo_url"
    }
}

struct Logo: Decodable {
    
    let mimeType: String?
    let url: String?
    
    enum CodingKeys: String, CodingKey {
        case mimeType = "mime_type"
        case url
    }
}

标签: iosswiftxcodeswift5decodable

解决方案


如果你不能改变这个写得很糟糕的 API,你需要一个自定义解码器,你基本上尝试解码为你想要的类型,并且失败了 - 让它nil

struct Model: Decodable {
    let logo: Logo?

    enum CodingKeys: String, CodingKey {
        case logo = "logo_url"
    }
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        
        if let logo = try? container.decode(Logo.self, forKey: .logo) {
            self.logo = logo
        } else {
            self.logo = nil
        }
    }
}

推荐阅读