Swift - JSON Сериализация вложенного объекта - PullRequest
0 голосов
/ 30 июня 2018

У меня есть объект, созданный из 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
   }
}

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

1001 * 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")
0 голосов
/ 30 июня 2018

Сделай это с ленивым свойством

EDIT

Option1

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

  }()

Вариант 2

var  adreess1:Address {
    return Address.getAddress(addressId: self.addressId)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...