Ios Swift-嵌套对象的JSON序列化
我有一个从JSON(序列化)创建的对象。此对象具有表示存储在系统中的另一个对象的id属性。在序列化过程中如何获取嵌套对象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
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吗?