使用Alamofire如何从API获取嵌套结构体的解码数据
解决Alamofire解码嵌套结构体的问题
你的代码存在几个关键问题,导致无法获取嵌套结构体的数据,以下是具体修正方案:
问题核心分析
- MyData缺少嵌套结构体的存储属性:你仅定义了
employment、address等嵌套结构体类型,但未在MyData中添加对应的属性字段,解码后自然无法访问这些嵌套数据。 - JSONDecoder配置顺序错误:
keyDecodingStrategy必须在解码操作前设置,否则不会生效。 - 强制解包存在崩溃风险:
json!的强制解包方式不安全,建议用可选绑定做安全处理。 - 类型命名不符合Swift规范:Swift类型名应遵循大驼峰命名法(首字母大写),这是社区通用的编码规范。
修正后的完整代码
import Foundation import Alamofire // 修正类型命名为大驼峰规范 struct MyData: Codable { let id: Int let uid: String let password: String let firstName: String // 配合keyDecodingStrategy映射JSON的first_name let lastName: String let username: String let email: String let avatar: String let gender: String let phoneNumber: String let socialInsuranceNumber: String let dateOfBirth: String // 添加嵌套结构体的属性字段,对应JSON中的嵌套节点 let employment: Employment let address: Address let creditCard: CreditCard let subscription: Subscription struct Employment: Codable { let title: String let keySkill: String } struct Address: Codable { let city: String let streetName: String let streetAddress: String let zipCode: String let state: String let country: String let coordinates: Coordinates struct Coordinates: Codable { let lat: Int let lng: Int } } struct CreditCard: Codable { let ccNumber: String } struct Subscription: Codable { let plan: String let status: String let paymentMethod: String let term: String } } func getApi() { let url = "https://random-data-api.com/api/v2/users" AF.request(url).responseData { response in debugPrint(response) guard let data = response.data else { return } do { let decoder = JSONDecoder() // 先配置解码策略,再执行解码操作 decoder.keyDecodingStrategy = .convertFromSnakeCase guard let userData = try decoder.decode(MyData.self, from: data) else { print("解码结果为空") return } // 访问父结构体属性 print("社保号:\(userData.socialInsuranceNumber)") // 访问一级嵌套结构体属性 print("职位名称:\(userData.employment.title)") print("所在城市:\(userData.address.city)") // 访问二级嵌套结构体属性 print("坐标纬度:\(userData.address.coordinates.lat)") print("信用卡号:\(userData.creditCard.ccNumber)") } catch { print("解码失败:\(error.localizedDescription)") } } }
关键修改说明
- 添加嵌套属性:在
MyData中声明let employment: Employment等字段,让解码器明确需要解析JSON中对应的嵌套节点。 - 调整Decoder配置顺序:将
decoder.keyDecodingStrategy = .convertFromSnakeCase放在decode方法之前,确保自动将JSON的蛇形命名(如first_name)映射到Swift的驼峰命名(firstName)。 - 安全解包处理:用
guard let userData = ...替代强制解包,避免空值导致的运行时崩溃。 - 层级访问嵌套数据:通过
父对象.嵌套结构体属性.字段的层级结构访问,比如userData.address.coordinates.lat即可获取二级嵌套的纬度值。
内容的提问来源于stack exchange,提问作者bumblebee
相关产品推荐
相关产品推荐

