You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:45:54