Swift 4.2 Расшифровка объекта Неизвестные ключи - PullRequest
0 голосов
/ 05 марта 2019

В настоящее время я создаю приложение как личный проект, который опирается на получение данных с сервера.Я могу успешно получить данные, однако столкнулся с проблемой при попытке декодирования.Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю ключей для некоторых объектов, пока не получу их с сервера.Данные, которые я получаю, выглядят так:

{
    "result": 0,
    "id": 1,
    "error": null,
    "data": {
        "UNKOWN_KEY": {
            "knownKey": "test",
            "knownKey": "test",
            "knownKey": "test",
        },
        "UNKOWN_KEY": {
            "knownKey": "test",
            "knownKey": "test",
            "knownKey": "test",
        },
        "UNKOWN_KEY": {
            "knownKey": "test",
            "knownKey": "test",
            "knownKey": "test",
        },
        "UNKOWN_KEY": {
            "knownKey": "test",
            "knownKey": "test",
            "knownKey": "test",
        }
    }
}

На самом деле я не могу понять, как декодировать эти UNKOWN_KEY s, и это мешает мне прогрессировать.Я пробовал использовать следующее:

let dynamicContainer = try decoder.container(keyedBy: DeviceDataKey.self)

for key in dynamicContainer.allKeys {
    if let deviceData = try? dynamicContainer.decode(ACDeviceData.self, forKey: key) {
        data.insert(deviceData, at: 0)
    }
}

Любая помощь, которую может предложить каждый, будет очень признательна.Заранее спасибо.

1 Ответ

3 голосов
/ 05 марта 2019

Ваше значение для "data" - это словарь с ключом типа String и значением в качестве вашей пользовательской модели.Если вы используете Codable, просто укажите тип data в качестве словаря

let data: [String: YourModel]

Затем декодируйте полученный Data как вашу Response модель

struct Response: Decodable {
    let result, id: Int
    let error: String?
    let data: [String: YourModel]
}

struct YourModel: Decodable {
    let knownKey: String
}

Если вам нужно получить все ваши модели, просто используйте compactMap в своем словаре

do {
    let decoded = try JSONDecoder().decode(Response.self, from: data)
    let models = decoded.data.compactMap { $0.value }
} catch { print(error) }
...