使用动态密钥的Swift JSON解码

时间:2019-06-12 16:00:22

标签: json swift decoder

我正在尝试使用动态密钥解码嵌套的json,但是找不到解决方案。 这是我的json:

{
    "available_channels": {
        "1000": {
            "creation_date": "1111222",
            "category_id": "9"
        },
        "1001": {
            "creation_date": "222333",
            "category_id": "10"
        }
}

如您所见,“ 1000”和“ 1001”是动态的。

我正在使用的模型:

struct StreamsData: Codable{
    let availableChannels: AvailableChannels
}

struct AvailableChannels: Codable{
    let channels: [String: Channel]
}

struct Channel: Codable{
    let creationDate: String
    let categoryId: String
}

“ StreamsData”是根对象

“ AvailableChannels”是包含所有通道对象的对象

“频道”频道模型

解码json:

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let streams = try decoder.decode(StreamsData.self, from: data)

使用此代码,我会遇到此错误:

  

CodingKeys(stringValue:“ availableChannels”,intValue:nil)   -debugDescription:“与键CodingKeys(stringValue:\“ channels \”,intValue:nil)(\“ channels \”)没有关联的值。”

问题很明显,因为声明“ AvailableChannels”具有“ channel”属性,因此解码器试图查找“ channels”作为包含“ creation_date”的对象的键。

谢谢,您能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您只需要

struct StreamsData: Codable{
    let availableChannels: [String: Channel]
}

struct Channel: Codable{
    let creationDate,categoryId: String 
}

do {
    let dec = JSONDecoder()
    dec.keyDecodingStrategy = .convertFromSnakeCase
    let res = try dec.decode(StreamsData.self, from: data)
}
catch { 
    print(error)
}