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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:09:02