gpt4 book ai didi

swift - 将 JSON 文件中的对象扁平化为 Swift 中的嵌套对象结构

转载 作者:行者123 更新时间:2023-12-02 02:48:48 24 4
gpt4 key购买 nike

给定一个具有嵌套对象结构的 JSON 对象,如下所示:

{
"users":[
{
"user":{
"name":"Adam",
"age":25
},
"address":{
"city":"Stockholm",
"country":"Sweden"
}
},
{
"user":{
"name":"Lilly",
"age":24
},
"address":{
"city":"Copenhagen",
"country":"Denmark"
}
}
]
}

如何正确执行Decodable对象的实现如下所示。

struct User {
struct Address {
let city: String
let country: String
}

let name: String
let age: Int
let address: Address
}

请注意,Swift 结构体包含一个嵌套结构体 Address ,而 JSON 对象有 address在一个单独的对象中。是否可以创建 Decodable处理这种情况的实现?

我尝试了各种方法,但所有方法都包括创建中间对象,这些对象稍后将映射到 User结构。是否可以创建一个不涉及创建这些中间对象的实现?

最佳答案

您可以使用自定义解码器,这样就不必创建其他对象。

struct User: Decodable {
let name: String
let age: Int
let address: Address


struct Address: Decodable {
let city: String
let country: String
}

enum CodingKeys: String, CodingKey {
case user
case address
}

enum UserKeys: String, CodingKey {
case name
case age
}

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)

let user = try container.nestedContainer(keyedBy: UserKeys.self, forKey: .user)
name = try user.decode(String.self, forKey: .name)
age = try user.decode(Int.self, forKey: .age)
address = try container.decode(Address.self, forKey: .address)

}
}

因此将您的数据放入 Playground

let data = """
{
"users":[
{
"user":{
"name":"Adam",
"age":25
},
"address":{
"city":"Stockholm",
"country":"Sweden"
}
},
{
"user":{
"name":"Lilly",
"age":24
},
"address":{
"city":"Copenhagen",
"country":"Denmark"
}
}
]
}
""".data(using: .utf8)!

你可以这样解码:

let decoder = JSONDecoder()
let result = try! decoder.decode([String:[User]].self, from: data)

或者您可以创建一个 Users 结构,这样您就不必处理字典

struct Users: Decodable {
let users: [User]
}

let decoder = JSONDecoder()
let result = try! decoder.decode(Users.self, from: data)

关于swift - 将 JSON 文件中的对象扁平化为 Swift 中的嵌套对象结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62403333/

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