Swift 如何知道 json 键是否为空或没有键?

Swift how to know if json key is null or no key?

我有一个结构,它反映来自 nesed JSON 的数据,带有 nilable 变量。

struct JsonReceived: Decodable {
    let data: JsonReceivedData
}

struct JsonReceivedData: Decodable {
    let key1: String?
    let key2: String?
    let key3: String?
    let key4: String?
    let key5: String?
}

然后我用 JSONDecoder 对 json 进行编码并将其数据发送到函数。

let res = try JSONDecoder().decode(JsonReceived.self, from: data)

self.addData(res.data.key1)
self.addData(res.data.key2)
self.addData(res.data.key3)
self.addData(res.data.key4)
self.addData(res.data.key5)

问题是,有时 JSON 数据看起来像这样

{
    "data": {
        "key1": "value1",
        "key3": "value3",
        "key5": null,
    }
}

如果密钥不存在,我不想从函数发送数据,

正如您在我的 JSON 示例中看到的那样,没有 key2key4 键值对,所以我不想将它们发送到函数, key5 是 null 但它仍然有一个键,所以我希望它发送到函数,即使它是 null。

我希望输出是这样的。

if isHaveAkeyFromJSON(res.data.key2) {
    self.addData(res.data.key2)
}

res不知道是怎么创建的。有值的键有值,没有值的键没有值。如果您需要该信息,您需要再次查看接收 JSON。

let testDictionary = try decoder.decode([String: String?].self, from: data)

然后测试字典中的键:

if testDictionary.keys.contains(res.key2) {
    self.addData(res.key2)
}

如果您不需要用于其他用途的结构,那么您可以一次解码并调用您的方法

struct JsonReceived: Codable {
    let data: [String: String?]

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        data = try container.decode([String: String?].self, forKey: .data)
        data.values.forEach {
            self.addData([=10=])
        }
    }
}