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

