【问题标题】:Swift 4.2 Decoding Object Unknown KeysSwift 4.2 解码对象未知键
【发布时间】:2019-07-26 21:19:40
【问题描述】:

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

{
    "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_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)
    }
}

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

【问题讨论】:

    标签: ios json rest swift4 decodable


    【解决方案1】:

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

    【讨论】:

    • 伴侣。你是个传奇。非常感谢,你让我度过了一个愉快的夜晚!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    相关资源
    最近更新 更多