Swift 4.2 解码对象未知键

Bra*_*ano 1 rest json ios swift4 decodable

我目前正在构建一个应用程序作为个人项目,该项目依赖于从服务器获取数据。我可以成功获取数据,但在尝试解码时遇到麻烦。我面临的问题是,在从服务器收到某些对象之前,我不知道它们的密钥。我得到的数据如下所示:

{
    "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",
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于我的一生,我无法弄清楚如何解码这些UNKOWN_KEYs,它阻止了我的进步。我尝试过使用以下内容:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人可以提供的任何帮助将不胜感激。提前致谢。

Rob*_*ler 5

您的值"data"是字典,其键类型String和值作为您的自定义模型。如果您使用的是Codable,只需将类型指定data为字典

let data: [String: YourModel]
Run Code Online (Sandbox Code Playgroud)

然后解码收到DataResponse模型

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

struct YourModel: Decodable {
    let knownKey: String
}
Run Code Online (Sandbox Code Playgroud)

如果您需要获取所有模型,只需compactMap在字典上使用即可

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

  • 伴侣。你是一个传奇。非常感谢你,你让我度过了一个愉快的夜晚! (2认同)