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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:39:11