SwiftUi 解码 JSON
SwiftUi Decoding JSON
我是 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
}
我收到这个错误
致命错误:'try!' 表达式意外引发错误:Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "t", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription : "No value associated with key CodingKeys(stringValue: "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)
}
但是如果每个数组中的值的顺序总是相同的,即day/times/type那么我们可以使用自定义初始化解码以获得[String: TimeStampForCurrentDay]
[=15=类型的字典]
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)
}
我是 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
}
我收到这个错误
致命错误:'try!' 表达式意外引发错误:Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "t", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription : "No value associated with key CodingKeys(stringValue: "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)
}
但是如果每个数组中的值的顺序总是相同的,即day/times/type那么我们可以使用自定义初始化解码以获得[String: TimeStampForCurrentDay]
[=15=类型的字典]
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)
}