在Swift中如何正确解码包含特殊键的嵌套JSON数据?
Swift 嵌套JSON解码错误修正方案
核心问题
你代码的核心错误有两处:
- 你提供的JSON顶层是单个对象,而解码时传入了
[Response].self尝试解析为数组,类型不匹配直接导致解码失败 - 使用
try!强制忽略错误,无法捕获具体的解码异常信息,排查问题难度高
另外你现有的CodingKeys映射完全冗余,属性名和JSON字段名一致的情况下不需要手动编写映射规则。
修正后的代码
// 不需要的@odata.context字段可以忽略,无需在模型中声明 struct Response: Codable { let value: [Value] } struct Value: Codable { let message: Message } struct Message: Codable { let url: String let path: String } func testJSON() { let decoder = JSONDecoder() guard let data = jsonString.data(using: .utf8) else { print("字符串转Data失败") return } do { // 解码目标是单个Response对象,不是数组 let response = try decoder.decode(Response.self, from: data) // 提取url字段示例 if let firstValue = response.value.first { let targetUrl = firstValue.message.url print("解析得到的url:\(targetUrl)") print("解析得到的path:\(firstValue.message.path)") } print("value数组长度:\(response.value.count)") } catch { // 打印具体错误,方便排查问题 print("解码失败:\(error)") } }
如果你需要解析@odata.context字段,只需要调整Response的定义即可:
struct Response: Codable { let odataContext: String let value: [Value] enum CodingKeys: String, CodingKey { case odataContext = "@odata.context" case value } }
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

