Swift 4.2解码对象未知键

时间:2019-03-05 11:54:06

标签: ios json rest 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",
        }
    }
}

在我的一生中,我不知道如何解码那些UNKOWN_KEY,这使我无法继续前进。我尝试使用以下内容:

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 个答案:

答案 0 :(得分:3)

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