Ios Swift-嵌套对象的JSON序列化

Ios Swift-嵌套对象的JSON序列化,ios,json,swift,serialization,Ios,Json,Swift,Serialization,我有一个从JSON(序列化)创建的对象。此对象具有表示存储在系统中的另一个对象的id属性。在序列化过程中如何获取嵌套对象 import UIKit class Person: Codable { let firstName: String let lastName: String let addressId: String let address: Address // How to create it during serialisation pr

我有一个从JSON(序列化)创建的对象。此对象具有表示存储在系统中的另一个对象的id属性。在序列化过程中如何获取嵌套对象

import UIKit


class Person: Codable {
    let firstName: String
    let lastName: String
    let addressId: String
    let address: Address // How to create it during serialisation

    private enum CodingKeys: String, CodingKey {
        case firstName
        case lastName
        case addressId = "addressId"
    }

    init(firstName: String, lastName: String, addressId:String) {
        self.firstName = firstName
        self.lastName = lastName
        self.addressId = addressId
    }

    required init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        self.firstName = try values.decode(String.self, forKey: .firstName)
        self.lastName = try values.decode(String.self, forKey: .lastName)
        self.addressId = try? values.decode(URL.self, forKey: .addressId)
    }
}

struct PersonsList : Codable {
    let persons: [Person]
}

class Address {

   static func getAddress(addressId: String) -> Address
   {
         //some code
         return address
   }
}

用lazy属性做它

编辑

选择1

 lazy var address:Address = { [unowned self] in
    return Address.getAddress(addressId: self.addressId)

  }()
选择2

var  adreess1:Address {
    return Address.getAddress(addressId: self.addressId)
}
JSON 假设这是您的json

let json = """
[
    {
        "firstName": "James",
        "lastName": "Kirk",
        "address": { "id": "efg" }
    }
]
"""
模型 您可以简化定义模型的方式

struct Person: Codable {
    let firstName: String
    let lastName: String
    let address: Address

    struct Address: Codable {
        let id: String
    }
}
如您所见,无需编写自定义的
init(:from)

从JSON到数据 为了测试它,我们将把json转换成一个
Data

let data = json.data(using: .utf8)!
解码 最后我们可以解码数据

if let persons = try? JSONDecoder().decode([Person].self, from: data) {
    print(persons.first?.address.id)
}
输出

Optional("efg")

在json序列化过程中是否会自动调用此函数?@Luda使用此函数,您无需手动初始化Address对象。当您访问
Person
的address属性时,它将自动初始化。我有这样一个消息:“lazy”不能用于计算属性。您可以显示原始JSON吗?