将 JSON 文件中的对象扁平化为 Swift 中的嵌套对象结构[重复]

2023-12-30

给定一个具有嵌套对象结构的 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)

    }
}

因此,将您的数据放入游乐场

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 JSON 文件中的对象扁平化为 Swift 中的嵌套对象结构[重复] 的相关文章

随机推荐