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

使用Alamofire如何从API获取嵌套结构体的解码数据

解决Alamofire解码嵌套结构体的问题

你的代码存在几个关键问题,导致无法获取嵌套结构体的数据,以下是具体修正方案:

问题核心分析

  1. MyData缺少嵌套结构体的存储属性:你仅定义了employment、address等嵌套结构体类型,但未在MyData中添加对应的属性字段,解码后自然无法访问这些嵌套数据。
  2. JSONDecoder配置顺序错误:keyDecodingStrategy必须在解码操作前设置,否则不会生效。
  3. 强制解包存在崩溃风险:json!的强制解包方式不安全,建议用可选绑定做安全处理。
  4. 类型命名不符合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)")
        }
    }
}

关键修改说明

  1. 添加嵌套属性:在MyData中声明let employment: Employment等字段,让解码器明确需要解析JSON中对应的嵌套节点。
  2. 调整Decoder配置顺序:将decoder.keyDecodingStrategy = .convertFromSnakeCase放在decode方法之前,确保自动将JSON的蛇形命名(如first_name)映射到Swift的驼峰命名(firstName)。
  3. 安全解包处理:用guard let userData = ...替代强制解包,避免空值导致的运行时崩溃。
  4. 层级访问嵌套数据:通过父对象.嵌套结构体属性.字段的层级结构访问,比如userData.address.coordinates.lat即可获取二级嵌套的纬度值。

内容的提问来源于stack exchange,提问作者bumblebee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:42:40