Swift中使用Codable解析含数组的复杂JSON遇到问题
解决Swift Codable解析含数组的复杂JSON问题
嘿,我来帮你搞定这个复杂JSON的Codable解析问题!先拆解下你提供的JSON结构,咱们一步步构建对应的模型,肯定能解决你的困扰。
你的JSON层级很清晰:
- 根对象包含一个
data数组,数组里是玩家信息对象 - 玩家对象嵌套了
attributes(属性详情)和relationships(关联数据)两个子对象 - 关联数据里还嵌套了
assets,它又包含一个空的data数组
接下来直接上代码方案,每个环节都给你标注清楚注意点:
1. 定义匹配JSON结构的Codable模型
import Foundation // 根响应模型,对应最外层的JSON对象 struct RootResponse: Codable { let data: [Player] } // 玩家信息模型,对应data数组里的每个元素 struct Player: Codable { let type: String let id: String let attributes: PlayerAttributes let relationships: PlayerRelationships } // 玩家属性模型,对应attributes嵌套对象 struct PlayerAttributes: Codable { let createdAt: Date let name: String let patchVersion: String let shardId: String let stats: String? // JSON里stats是null,必须设为可选类型,若实际是对象可改为[String: Any]? let titleId: String let updatedAt: Date } // 玩家关联数据模型,对应relationships嵌套对象 struct PlayerRelationships: Codable { let assets: Assets // 处理JSON里省略的"..."字段:只声明需要的字段,解码器会自动忽略未知字段 enum CodingKeys: String, CodingKey { case assets // 后续新增已知字段可在这里添加 } } // Assets模型,对应assets嵌套对象 struct Assets: Codable { let data: [AssetData] // 空数组对应元素类型,若暂时不清楚结构可先定义空结构体 } // 若AssetData的具体结构未知,先定义空的Codable结构体占位 struct AssetData: Codable {}
2. 配置解码器并执行解析
注意:你的JSON日期是ISO8601格式,必须手动设置解码策略,否则日期字段会解析失败。
// 替换成你的JSON数据源(这里用字符串示例) let jsonString = """ { "data": [ { "type":"player", "id":"account.7e5b92e6612440349afcc06b7c390114", "attributes": { "createdAt":"2018-04-06T04:59:40Z", "name":"bob", "patchVersion":"", "shardId":"pc-na", "stats":null, "titleId":"bluehole-pubg", "updatedAt":"2018-04-06T04:59:40Z" }, "relationships": { "assets": { "data":[] } } ] } """ guard let jsonData = jsonString.data(using: .utf8) else { fatalError("JSON字符串转Data失败") } let decoder = JSONDecoder() // 配置ISO8601日期解码策略 decoder.dateDecodingStrategy = .iso8601 do { let response = try decoder.decode(RootResponse.self, from: jsonData) // 解析成功,可正常访问数据 if let firstPlayer = response.data.first { print("玩家名称:\(firstPlayer.attributes.name)") print("创建时间:\(firstPlayer.attributes.createdAt)") } } catch { // 打印详细错误,方便排查问题 print("解析失败:\(error.localizedDescription)") print("错误详情:\(error)") }
常见问题排查指南
- 日期解析失败:一定要设置
dateDecodingStrategy = .iso8601,默认解码器不识别ISO格式的日期字符串 - null值报错:所有JSON里为null的字段,模型里必须设为可选类型(比如
String?) - 未知字段导致报错:通过
CodingKeys只声明需要的字段,解码器会自动忽略JSON里未声明的字段 - 数组元素类型不匹配:如果
assets.data后续有实际数据,只需补充完善AssetData的结构体字段即可
内容的提问来源于stack exchange,提问作者D. Childs
相关产品推荐
相关产品推荐

