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
相关产品推荐
相关产品推荐

