Я пытаюсь вручную развернуть JSON без использования кода. Я могу отобразить верхний уровень, но не могу отобразить адрес получателя. Я знаю, что это что-то в моей модели. Я надеялся, что кто-нибудь сможет взглянуть на мой код.
Пример JSON
Моя модель
class Beneficiary {
private struct JSONConstants {
static let lastName = "lastName"
static let firstName = "firstName"
static let designationCode = "designationCode"
static let beneType = "beneType"
static let ssn = "socialSecurityNumber"
static let dob = "dateOfBirth"
static let middleName = "middleName"
static let phoneNumber = "phoneNumber"
static let beneficiaryAddress = "beneficiaryAddress"
}
let beneficiaryLastName: String
let beneficiaryFirstName: String
let beneficiaryDesignationCode: String
let beneficiaryType: String
let beneficiarySSN: String
let beneficiaryDOB: String
let beneficiaryMiddleName: String
let beneficiaryPhoneNumber: String
let beneficiaryAddress: BeneficiaryAddress
init(beneficiaryLastName: String, beneficiaryFirstName: String, beneficiaryDesignationCode: String, beneficiaryType: String, beneficiarySSN: String, beneficiaryDOB: String, beneficiaryMiddleName: String, beneficiaryPhoneNumber: String, beneficiaryAddress: BeneficiaryAddress) {
self.beneficiaryLastName = beneficiaryLastName
self.beneficiaryFirstName = beneficiaryFirstName
self.beneficiaryDesignationCode = beneficiaryDesignationCode
self.beneficiaryType = beneficiaryType
self.beneficiarySSN = beneficiarySSN
self.beneficiaryDOB = beneficiaryDOB
self.beneficiaryMiddleName = beneficiaryMiddleName
self.beneficiaryPhoneNumber = beneficiaryPhoneNumber
self.beneficiaryAddress = beneficiaryAddress
}
///Convenience Init used to create a Beneficiary object with a json object
convenience init(json: [String: AnyObject]) {
let beneficiaryLastName = json[JSONConstants.lastName] as? String ?? ""
let beneficiaryFirstName = json[JSONConstants.firstName] as? String ?? ""
let beneficiaryDesignationCode = json[JSONConstants.designationCode] as? String ?? ""
let beneficiaryType = json[JSONConstants.beneType] as? String ?? ""
let beneficiarySSN = json[JSONConstants.ssn] as? String ?? ""
let beneficiaryDOB = json[JSONConstants.dob] as? String ?? ""
let beneficiaryMiddleName = json[JSONConstants.middleName] as? String ?? ""
let beneficiaryPhoneNumber = json[JSONConstants.phoneNumber] as? String ?? ""
let beneficiaryAddress = json[JSONConstants.beneficiaryAddress] as? BeneficiaryAddress ?? BeneficiaryAddress(beneficiaryAddressOne: "Unavailable", beneficiaryAddressTwo: "Unavailable", beneficiaryCity: "Unavailable", beneficiaryZipCode: "Unavailable", beneficiaryStateCode: "Unavailable", beneficiaryCountry: "Unavailable")
self.init(beneficiaryLastName: beneficiaryLastName, beneficiaryFirstName: beneficiaryFirstName, beneficiaryDesignationCode: beneficiaryDesignationCode, beneficiaryType: beneficiaryType, beneficiarySSN: beneficiarySSN, beneficiaryDOB: beneficiaryDOB, beneficiaryMiddleName: beneficiaryMiddleName, beneficiaryPhoneNumber: beneficiaryPhoneNumber, beneficiaryAddress: beneficiaryAddress)
}
/**
helper function used to transform self into JSON, used for local persistence.
- returns: dictionary that we can use to serialize later
*/
func convertSelfToJSON() -> [String:Any] {
return [
JSONConstants.lastName: beneficiaryLastName,
JSONConstants.firstName: beneficiaryFirstName,
JSONConstants.designationCode: beneficiaryDesignationCode,
JSONConstants.beneType: beneficiaryType,
JSONConstants.ssn: beneficiarySSN,
JSONConstants.dob: beneficiaryDOB,
JSONConstants.middleName: beneficiaryMiddleName,
JSONConstants.phoneNumber: beneficiaryPhoneNumber,
JSONConstants.beneficiaryAddress: beneficiaryAddress
]
}
}
//МАРК: - Второй уровень адреса получателя
/** Данные бенефициара второго уровня из JSON */
class BeneficiaryAddress {
private struct JSONConstants {
static let addressLineOne = "firstLineMailing"
static let addressLineTwo = "scndLineMailing"
static let city = "city"
static let zipCode = "zipCode"
static let stateCode = "stateCode"
static let country = "oountry"
}
let beneficiaryAddressOne: String
let beneficiaryAddressTwo: String // Handle this properly as the result is null
let beneficiaryCity: String
let beneficiaryZipCode: String
let beneficiaryStateCode: String
let beneficiaryCountry: String
init(beneficiaryAddressOne: String, beneficiaryAddressTwo: String, beneficiaryCity: String, beneficiaryZipCode: String, beneficiaryStateCode: String, beneficiaryCountry: String) {
self.beneficiaryAddressOne = beneficiaryAddressOne
self.beneficiaryAddressTwo = beneficiaryAddressTwo
self.beneficiaryCity = beneficiaryCity
self.beneficiaryZipCode = beneficiaryZipCode
self.beneficiaryStateCode = beneficiaryStateCode
self.beneficiaryCountry = beneficiaryCountry
}
///Convenience Init used to create a Beneficiary object with a json object
convenience init(json: [String: AnyObject]) {
let beneficiaryAddressOne = json[JSONConstants.addressLineOne] as? String ?? ""
let beneficiaryAddressTwo = json[JSONConstants.addressLineTwo] as? String ?? ""
let beneficiaryCity = json[JSONConstants.city] as? String ?? ""
let beneficiaryZipCode = json[JSONConstants.zipCode] as? String ?? ""
let beneficiaryStateCode = json[JSONConstants.stateCode] as? String ?? ""
let beneficiaryCountry = json[JSONConstants.country] as? String ?? ""
self.init(beneficiaryAddressOne: beneficiaryAddressOne, beneficiaryAddressTwo: beneficiaryAddressTwo, beneficiaryCity: beneficiaryCity, beneficiaryZipCode: beneficiaryZipCode, beneficiaryStateCode: beneficiaryStateCode, beneficiaryCountry: beneficiaryCountry)
}
/**
helper function used to transform self into JSON, used for local persistence.
- returns: dictionary that we can use to serialize later
*/
func convertSelfToJSON() -> [String: Any] {
return [
JSONConstants.addressLineOne: beneficiaryAddressOne,
JSONConstants.addressLineTwo: beneficiaryAddressTwo,
JSONConstants.city: beneficiaryCity,
JSONConstants.zipCode: beneficiaryZipCode,
JSONConstants.stateCode: beneficiaryStateCode,
JSONConstants.country: beneficiaryCountry,
]
}
}
Можете ли вы привести мне пример? Я пытаюсь, но мне не везет. Я не уверен, нужно ли мне создавать вычисляемое свойство вместо другого класса?
У вас уже есть подходящий инициализатор init(json: [String: AnyObject])
в BeneficiaryAddress
, так почему бы не использовать его? Как сказано, сначала приведите словарь, а затем используйте init
@JoakimDanielson Я чувствую, что это то, что я пытаюсь сделать, услышав оба ваших совета. Не могли бы вы показать мне, что вы имеете в виду?
let temp = json[JSONConstants.beneficiaryAddress] as? [String: AnyObject]
и тогда, если температура не равна нулю let beneficiaryAddress = BeneficiaryAddress(json: temp)
@joakimDanielson Должно ли это быть в удобном инициализаторе класса Бенефициара?
@JesseRae – Да.
Возможно, если вы собираетесь пойти по этому пути, вы можете Beneficiary.init(json:)
воспользоваться инициализатором BeneficiaryAddress(json:)
, например:
class Beneficiary {
…
///Convenience Init used to create a Beneficiary object with a json object
convenience init(json: [String: AnyObject]) {
let beneficiaryLastName = …
let beneficiaryFirstName = …
let beneficiaryDesignationCode = …
let beneficiaryType = …
let beneficiarySSN = …
let beneficiaryDOB = …
let beneficiaryMiddleName = …
let beneficiaryPhoneNumber = …
let beneficiaryAddress = if let addressDictionary = json[JSONConstants.beneficiaryAddress] as? [String: AnyObject] {
BeneficiaryAddress(json: addressDictionary)
} else {
BeneficiaryAddress(beneficiaryAddressOne: "Unavailable", beneficiaryAddressTwo: "Unavailable", beneficiaryCity: "Unavailable", beneficiaryZipCode: "Unavailable", beneficiaryStateCode: "Unavailable", beneficiaryCountry: "Unavailable")
}
self.init(beneficiaryLastName: beneficiaryLastName, beneficiaryFirstName: beneficiaryFirstName, beneficiaryDesignationCode: beneficiaryDesignationCode, beneficiaryType: beneficiaryType, beneficiarySSN: beneficiarySSN, beneficiaryDOB: beneficiaryDOB, beneficiaryMiddleName: beneficiaryMiddleName, beneficiaryPhoneNumber: beneficiaryPhoneNumber, beneficiaryAddress: beneficiaryAddress)
}
…
}
Есть много вариаций на эту тему, но, надеюсь, это иллюстрирует идею.
Это помогло моему приложению, спасибо. Теперь это имеет гораздо больше смысла. Я знал, что нахожусь прямо там, но мне это показалось неправильным. Я буквально перерыл весь Интернет в поисках примеров и не смог их найти. Все используют кодировку, и это понятно.
Разве вам не следует декодировать BeneficiaryAddress как [String: AnyObject], а затем преобразовать его в то, что вам нужно, так же, как вы преобразовывали Beneficiary?