我是Swift和SwiftUi的新手,正在尝试解码JSON文件。我知道我必须使用编码键,但当键是约会时,我不知道该怎么做。
我的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
}
我得到这个错误
致命错误:"try!"表达式意外引发错误:Swift。DecodingError.keyNotFound(CodingKeys(字符串值:"t",intValue:nil(,Swift。DecodingError.Context(编码路径:[],debugDescription:"没有与键CodingKeyss(字符串值:"t";,intValue:nil(("t"(关联的值&";,underlyingError: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)
}