问题描述
我是Swift和SwiftUi的新手,我正在尝试解码JSON文件。我知道我必须使用CodingKeys,但是当键是日期时,我不知道该怎么做。
我的JSON看起来像这样:
{
"2020-09-01": [
"Tuesday",[],"N"
],"2020-09-02": [
"Wednesday",[
"12:00p"
],"N"
]
}
我的模型如下:
struct TimeStamp: Codable {
var t = [TimeStampForCurrentDay]()
}
struct TimeStampForCurrentDay: Codable {
let day: String
let times: [String]
let type: String
}
我收到此错误
致命错误:“尝试!”表达式意外引发错误:Swift.DecodingError.keyNotFound(CodingKeys(stringValue:“ t”,intValue:nil),Swift.DecodingError.Context(codingPath:[],debugDescription:“没有与键CodingKeys(stringValue:” t相关联的值“,intValue:nil)(” t“)。”,底层错误:nil))
当我尝试使用此功能解码时
try! JSONDecoder().decode(TimeStamp.self,from: responseData)
解决方法
您所拥有的是[String: [Any]]
类型的字典,很难解码。您可以使用JSONSerialization
直接解码为该字典类型
do {
let result = try JSONSerialization.jsonObject(with: data) as? [String: [Any]]
//...
} catch {
print(error)
}
但是,如果每个数组中值的顺序始终相同,即天/时间/类型,那么我们可以使用自定义init进行解码,以获取类型为[String: TimeStampForCurrentDay]
的字典
struct TimeStampForCurrentDay: Codable {
let day: String
let times: [String]
let type: String
init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
day = try container.decode(String.self)
times = try container.decode([String].self)
type = try container.decode(String.self)
}
}
do {
let result = try JSONDecoder().decode([String: TimeStampForCurrentDay].self,from: data)
print(result)
} catch {
print(error)
}