使用 Swift 4 Codable 协议和未知字典键

Using Swift 4 Codable Protocol with Unknown Dictionary Keys

我正在与 NASA Near Earth Object Web Service 合作检索要在应用程序中显示的数据。我了解如何使用 Swift 4 的 Codable 协议,但我不了解如何映射部分响应。

使用 Paw,我检查了来自 API 的响应:

如您所见,near_earth_objects 结构是一个 Dictionary,键是日期。问题是 URL 参数是日期,因此这些日期结构会根据请求的日期而改变。因此,我不知道如何创建在使用 Codable 协议时自动映射的属性。

我试图进入这些结构内部的数据是 Array,其中包含 Dictionary

如何让我的模型对象符合 Codable 协议并在日期随着请求日期的变化而变化时映射这些结构?

如您所说,near_earth_objects是一个字典,但键不是日期,键是字符串,值是已知结构的数组。所以上面的代码将起作用:

...
let nearEarthObjects: [String: [IndexObject]]
...

enum CodingKey: String, CodingKeys {
    case nearEarthObjects = "near_earth_objects"
}

struct IndexObject: Decodable {
    ...
    let name: String
    ...
}

如果您不介意在解码后保留 Dictionary,则无需知道 Dictionary 编译时的密钥。

您只需指定类型为 Dictionary<String:YourCustomDecodableType> 的 属性。键将是与观察相对应的日期,值将是具有您的自定义类型的所有对象的数组。

struct NearEarthObject: Codable {
    let referenceID:String
    let name:String
    let imageURL:URL

    private enum CodingKeys: String, CodingKey {
        case referenceID = "neo_reference_id"
        case name
        case imageURL = "nasa_jpl_url"
    }
}

struct NEOApiResponse: Codable {
    let nearEarthObjects: [String:[NearEarthObject]]

    private enum CodingKeys: String,CodingKey {
        case nearEarthObjects = "near_earth_objects"
    }
}

do {
    let decodedResponse = try JSONDecoder().decode(NEOApiResponse.self, from: data)
} catch {
    print(error)
}