gpt4 book ai didi

json - 使用具有多个 key 的 Decodable 协议(protocol)

转载 作者:搜寻专家 更新时间:2023-11-01 05:47:21 24 4
gpt4 key购买 nike

假设我有以下代码:

import Foundation

let jsonData = """
[
{"firstname": "Tom", "lastname": "Smith", "age": {"realage": "28"}},
{"firstname": "Bob", "lastname": "Smith", "age": {"fakeage": "31"}}
]
""".data(using: .utf8)!

struct Person: Codable {
let firstName, lastName: String
let age: String?

enum CodingKeys : String, CodingKey {
case firstName = "firstname"
case lastName = "lastname"
case age
}
}

let decoded = try JSONDecoder().decode([Person].self, from: jsonData)
print(decoded)

一切正常,除了 age 总是 nil。这是有道理的。我的问题是如何在第一个示例中设置 Person 的年龄 = realage28,在第二个示例中设置 nilage 在这两种情况下都不是 nil 我希望它在第一种情况下是 28

有没有办法只使用 CodingKeys 而不必添加另一个结构或类来实现这一点?如果不是,我如何使用另一个结构或类以最简单的方式实现我想要的?

最佳答案

在解码嵌套 JSON 数据时,我最喜欢的方法是定义一个非常接近 JSON 的“原始”模型,如果需要,甚至可以使用 snake_case。它有助于将 JSON 数据真正快速地导入 Swift,然后您可以使用 Swift 进行所需的操作:

struct Person: Decodable {
let firstName, lastName: String
let age: String?

// This matches the keys in the JSON so we don't have to write custom CodingKeys
private struct RawPerson: Decodable {
struct RawAge: Decodable {
let realage: String?
let fakeage: String?
}

let firstname: String
let lastname: String
let age: RawAge
}

init(from decoder: Decoder) throws {
let rawPerson = try RawPerson(from: decoder)
self.firstName = rawPerson.firstname
self.lastName = rawPerson.lastname
self.age = rawPerson.age.realage
}
}

此外,我建议您谨慎使用 Codable,因为它同时暗示了 EncodableDecodable。看起来你只需要 Decodable 所以你的模型只符合那个协议(protocol)。

关于json - 使用具有多个 key 的 Decodable 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46723619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com