SwiftUi解码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
}

我收到此错误

致命错误:“尝试!”表达式意外引发错误: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)
}