使用 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)
}
我正在与 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)
}