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

Swift中如何将接口JSON的嵌套对象解析为自定义Struct?

更简洁的Swift JSON解码方案

你的代码里有个明显问题:json["object"] as! Data这行是错误的——从JSONSerialization解析出来的object是[String: Any]类型,不是Data,强制转换会直接崩溃。下面是更简洁、安全的实现方式,完全利用Swift的Codable协议处理,不需要混合两种JSON解析方式。

核心思路:定义通用API响应结构体

你的接口返回格式是固定的(code + 任意类型的object),可以用泛型结构体封装这个通用格式,这样不管object是Person还是其他类型,都能复用这个结构体。

完整代码示例

import Foundation

// 定义Person模型
struct Person: Decodable {
    let id: Int
    let name: String
}

// 通用API响应结构体,泛型T代表object的类型,只要T遵循Decodable即可
struct APIResponse<T: Decodable>: Decodable {
    let code: Int
    let object: T
}

// 模拟接口返回数据
let jsonString = """
{
    "code": 200,
    "object": {
        "id": 1,
        "name": "Peter"
    }
}
"""

// 解码流程
if let data = jsonString.data(using: .utf8) {
    do {
        // 直接解码成APIResponse<Person>,一次性拿到code和Person对象
        let response = try JSONDecoder().decode(APIResponse<Person>.self, from: data)
        if response.code == 200 {
            print(response.object.name) // 输出Peter
        } else {
            print("接口返回错误码:\(response.code)")
        }
    } catch {
        print("解码失败:\(error.localizedDescription)")
    }
} else {
    print("数据格式转换失败")
}

方案优势

  • 类型安全:全程用Codable处理,编译器会帮你检查类型匹配问题,避免JSONSerialization里强制类型转换导致的崩溃。
  • 代码简洁:不需要手动解析字典层级,一次性完成解码。
  • 复用性强:后续其他接口如果是同样的code+object格式,只需要替换泛型参数(比如APIResponse<Book>)就能直接复用。

额外建议

  • 避免使用强制解包(!):原代码里的data(using: .utf8)!、as! [String: Any]都可能导致崩溃,建议用可选绑定处理。
  • 细化错误处理:可以在catch里区分解码错误、数据格式错误等场景,方便排查问题。

内容的提问来源于stack exchange,提问作者Pedro Joaquín

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:03:24