Я столкнулся с ответом JSON, который не похож ни на один из тех, с которыми я привык работать. Вместо пар ключ-значение в строке есть раздел, в котором есть словарь с String
ключами и Int
значениями. Я хотел бы декодировать строковый ключ из словаря как объект Date
.
Вот рассматриваемый JSON:
[
{
"country": "Afghanistan",
"province": null,
"timeline": {
"cases": {
"5/22/20": 9216,
"5/23/20": 9998,
"5/24/20": 10582
},
"deaths": {
"5/22/20": 205,
"5/23/20": 216,
"5/24/20": 218
},
"recovered": {
"5/22/20": 996,
"5/23/20": 1040,
"5/24/20": 1075
}
}
},
]
Вот что я написал для Codable Struct to декодировать его:
struct HistoricCountry: Codable {
let country: String
let province: String?
let timeline: Timeline
}
struct Timeline: Codable {
let cases, deaths, recovered: [String: Int]
}
Вот код, который я написал для его декодирования. Это сработает, если я оставлю Timeline
в качестве словаря с ключом в виде пары ключ-значение строка / int, JSON декодируется правильно:
do {
let decoder = JSONDecoder()
let formatter = DateFormatter()
formatter.dateFormat = "M/dd/yy"
decoder.dateDecodingStrategy = .formatted(formatter)
let decodedElements = try decoder.decode([HistoricCountry].self, from: data)
XCTAssertEqual(decodedElements.count, 266)
} catch {
XCTFail("\n??? Decoding failed ???:\n\(error)")
}
Если я изменю пары значений ключа Timeline
на [Date: Int]
:
struct Timeline: Codable {
let cases, deaths, recovered: [Date: Int]
}
Я получаю эту ошибку:
??? Decoding failed ???:
typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "timeline", intValue: nil), CodingKeys(stringValue: "cases", intValue: nil)], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil))
Что я делаю не так и как исправить?