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

SwiftUI中URLSession多维JSON解码遇阻,请求技术帮助

问题分析与解决步骤

1. 核心解码错误

你当前解码时错误使用[String: TreeResponse].self,但服务器返回的是单个JSON对象而非键值对字典,这是解码失败的首要原因。

2. 结构体与JSON结构不匹配

你的SideData结构体定义了personKey字段,但JSON中Right/Left下直接是G1P1这类键值对,不存在personKey层级,导致结构不匹配。同时,若要实现treeResponse.Right.G1P1.Name的点语法访问,需将固定的Right/Left字段定义为结构体属性,而非字典键。


修正后的代码

结构体定义

struct TreeResponse: Codable {
    let success: Bool
    let message: String
    let treeData: TreeData
}

// 对应JSON中的treeData,包含固定的Right和Left分支
struct TreeData: Codable {
    let Right: [String: PersonInfo]
    let Left: [String: PersonInfo]
}

// 单个人物信息结构,与JSON字段完全匹配
struct PersonInfo: Codable {
    let Name: String
    let ID: Int
    let SubText: String
}

修正后的解码代码

URLSession.shared.dataTask(with: request) { (data, response, error) in
    guard let data = data, error == nil else {
        completion(.failure(.noData))
        return
    }
    
    do {
        // 直接解码为TreeResponse对象,而非字典包裹
        let treeResponse = try JSONDecoder().decode(TreeResponse.self, from: data)
        dump(treeResponse)
        
        // 实现你想要的访问逻辑
        if let johnName = treeResponse.treeData.Right["G1P1"]?.Name {
            print("Right分支G1P1的名字:\(johnName)")
        }
        
        completion(.success("Hooray"))
    } catch {
        // 打印具体错误,快速定位问题
        print("解码失败:\(error.localizedDescription)")
        print("错误详情:\(error)")
        completion(.failure(.decodingError))
    }
}.resume()

进一步优化(贴近理想访问方式)

若想跳过treeData层级,直接用treeResponse.Right["G1P1"]?.Name访问,可在TreeResponse中添加计算属性:

struct TreeResponse: Codable {
    let success: Bool
    let message: String
    let treeData: TreeData
    
    // 计算属性直接暴露Right/Left分支
    var Right: [String: PersonInfo] { treeData.Right }
    var Left: [String: PersonInfo] { treeData.Left }
}

调试技巧

  • 避免用try?忽略错误,改用do-catch捕获并打印错误细节,能快速定位字段名不匹配、类型不一致等问题。
  • 可通过print(String(data: data, encoding: .utf8))打印服务器返回的原始JSON,确认结构是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:05:16