Развертывание JSON вручную без кодирования – Swift

Я пытаюсь вручную развернуть 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,
        ]
    }
}

Разве вам не следует декодировать BeneficiaryAddress как [String: AnyObject], а затем преобразовать его в то, что вам нужно, так же, как вы преобразовывали Beneficiary?

Andrew 12.04.2024 15:55

Можете ли вы привести мне пример? Я пытаюсь, но мне не везет. Я не уверен, нужно ли мне создавать вычисляемое свойство вместо другого класса?

Jesse Rae 12.04.2024 16:33

У вас уже есть подходящий инициализатор init(json: [String: AnyObject]) в BeneficiaryAddress, так почему бы не использовать его? Как сказано, сначала приведите словарь, а затем используйте init

Joakim Danielson 12.04.2024 16:54

@JoakimDanielson Я чувствую, что это то, что я пытаюсь сделать, услышав оба ваших совета. Не могли бы вы показать мне, что вы имеете в виду?

Jesse Rae 12.04.2024 17:07
let temp = json[JSONConstants.beneficiaryAddress] as? [String: AnyObject] и тогда, если температура не равна нулю let beneficiaryAddress = BeneficiaryAddress(json: temp)
Joakim Danielson 12.04.2024 17:16

@joakimDanielson Должно ли это быть в удобном инициализаторе класса Бенефициара?

Jesse Rae 12.04.2024 17:32

@JesseRae – Да.

Rob 12.04.2024 17:43
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
2
7
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, если вы собираетесь пойти по этому пути, вы можете 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)
    }
    
    …
}

Есть много вариаций на эту тему, но, надеюсь, это иллюстрирует идею.

Это помогло моему приложению, спасибо. Теперь это имеет гораздо больше смысла. Я знал, что нахожусь прямо там, но мне это показалось неправильным. Я буквально перерыл весь Интернет в поисках примеров и не смог их найти. Все используют кодировку, и это понятно.

Jesse Rae 12.04.2024 17:56

Другие вопросы по теме