Swift不使用Codable手动解析JSON:受益人地址无法获取求助
Swift手动解析JSON时无法获取受益人地址字段的问题排查
我正尝试在Swift中不使用Codable手动解析JSON,目前能正常解析顶层数据,但无法获取受益人地址字段,确定问题出在模型代码中,希望帮忙检查代码。
JSON示例
{ "lastName": "示例姓氏", "firstName": "示例名字", "designationCode": "示例代码", "beneType": "示例类型", "socialSecurityNumber": "示例SSN", "dateOfBirth": "示例生日", "middleName": "示例中间名", "phoneNumber": "示例电话", "beneficiaryAddress": { "firstLineMailing": "地址第一行", "scndLineMailing": "地址第二行", "city": "城市", "zipCode": "邮编", "stateCode": "州代码", "country": "国家" } }
我的模型代码
Beneficiary类
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 } /// 便利初始化:通过JSON字典创建Beneficiary实例 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) } /// 将实例转换为JSON字典,用于本地持久化 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 ] } }
BeneficiaryAddress类
//MARK: - Beneficiary Address Level Two /// 受益人地址二级数据 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 // 需处理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 } /// 便利初始化:通过JSON字典创建BeneficiaryAddress实例 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) } /// 将实例转换为JSON字典,用于本地持久化 func convertSelfToJSON() -> [String: Any] { return [ JSONConstants.addressLineOne: beneficiaryAddressOne, JSONConstants.addressLineTwo: beneficiaryAddressTwo, JSONConstants.city: beneficiaryCity, JSONConstants.zipCode: beneficiaryZipCode, JSONConstants.stateCode: beneficiaryStateCode, JSONConstants.country: beneficiaryCountry, ] } }
问题排查与修正
1. 地址字段解析逻辑错误
在Beneficiary的便利初始化中,直接尝试将JSON中的beneficiaryAddress字段强转为BeneficiaryAddress类型,但JSON中的地址实际是[String: AnyObject]字典,无法直接转成自定义类实例。
修正代码:
将原来的地址解析代码:
let beneficiaryAddress = json[JSONConstants.beneficiaryAddress] as? BeneficiaryAddress ?? BeneficiaryAddress(beneficiaryAddressOne: "Unavailable", beneficiaryAddressTwo: "Unavailable", beneficiaryCity: "Unavailable", beneficiaryZipCode: "Unavailable", beneficiaryStateCode: "Unavailable", beneficiaryCountry: "Unavailable")
替换为:
// 先取出地址字典,再用BeneficiaryAddress的便利初始化创建实例 let addressDict = json[JSONConstants.beneficiaryAddress] as? [String: AnyObject] ?? [:] let beneficiaryAddress = BeneficiaryAddress(json: addressDict)
2. 地址类中JSON字段名拼写错误
在BeneficiaryAddress的JSONConstants中,country字段拼写为oountry(多了一个o),导致无法匹配JSON中的country字段,获取不到国家数据。
修正代码:
将:
static let country = "oountry"
改为:
static let country = "country"
3. 实例转JSON时的地址处理问题
在Beneficiary的convertSelfToJSON方法中,直接将beneficiaryAddress实例放入字典,后续序列化会失败,需要调用地址实例的convertSelfToJSON方法转成字典。
修正代码:
将原来的:
JSONConstants.beneficiaryAddress: beneficiaryAddress
改为:
JSONConstants.beneficiaryAddress: beneficiaryAddress.convertSelfToJSON()
修正后的完整代码
修正后的Beneficiary类
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 } /// 便利初始化:通过JSON字典创建Beneficiary实例 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 addressDict = json[JSONConstants.beneficiaryAddress] as? [String: AnyObject] ?? [:] let beneficiaryAddress = BeneficiaryAddress(json: addressDict) self.init(beneficiaryLastName: beneficiaryLastName, beneficiaryFirstName: beneficiaryFirstName, beneficiaryDesignationCode: beneficiaryDesignationCode, beneficiaryType: beneficiaryType, beneficiarySSN: beneficiarySSN, beneficiaryDOB: beneficiaryDOB, beneficiaryMiddleName: beneficiaryMiddleName, beneficiaryPhoneNumber: beneficiaryPhoneNumber, beneficiaryAddress: beneficiaryAddress) } /// 将实例转换为JSON字典,用于本地持久化 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, // 修正地址转JSON逻辑 JSONConstants.beneficiaryAddress: beneficiaryAddress.convertSelfToJSON() ] } }
修正后的BeneficiaryAddress类
//MARK: - Beneficiary Address Level Two /// 受益人地址二级数据 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 = "country" // 修正拼写错误 } let beneficiaryAddressOne: String let beneficiaryAddressTwo: String // 需处理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 } /// 便利初始化:通过JSON字典创建BeneficiaryAddress实例 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) } /// 将实例转换为JSON字典,用于本地持久化 func convertSelfToJSON() -> [String: Any] { return [ JSONConstants.addressLineOne: beneficiaryAddressOne, JSONConstants.addressLineTwo: beneficiaryAddressTwo, JSONConstants.city: beneficiaryCity, JSONConstants.zipCode: beneficiaryZipCode, JSONConstants.stateCode: beneficiaryStateCode, JSONConstants.country: beneficiaryCountry, ] } }
内容的提问来源于stack exchange,提问作者Jesse Rae
相关产品推荐
相关产品推荐

