Swift JSON декодировать с помощью динамических клавиш - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь декодировать вложенный 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» - это объекты, содержащие объекты всех каналов

Модель канала «Channel»

, декодирующая json:

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

С этим кодом у меня есть эта ошибка:

CodingKeys (stringValue: "availableChannels", intValue: nil) - debugDescription: "Нет значения, связанного с ключом CodingKeys (stringValue: \" channel \ ", intValue: nil) (\ "channel \"). "

Проблема ясна, поскольку объявлено, что« AvailableChannels »имеет свойство« канал », декодер пытается найти« каналы »"в качестве ключа для объекта, содержащего" creation_date ".

Не могли бы вы помочь мне решить эту проблему, спасибо.

1 Ответ

0 голосов
/ 12 июня 2019

Вам нужно только

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