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)
}