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

Swift中使用Codable解析嵌套JSON时出现报错问题求助

问题排查与解决

你的解析失败核心原因是JSON中的键名和结构体属性名不匹配:

  • JSON里的数组键是 "search-results"(连字符分隔)
  • 而你结构体里定义的属性是 search_results(下划线分隔)

JSONDecoder 默认不会自动处理这种连字符与下划线的转换,所以无法正确映射字段。下面提供两种可行的解决方法:

方法1:手动添加CodingKeys映射

给PagedCourses结构体添加CodingKeys枚举,明确指定search_results对应的JSON键为"search-results":

public struct PagedCourses: Codable {
    public struct Meta: Codable {
        public let page: Int
        // 此处CodingKeys可省略,属性名与JSON键完全匹配时编译器会自动生成
    }
    
    public struct Course: Codable {
        public let id: Int
        // 此处CodingKeys同样可省略
    }
    
    public let meta: Meta
    public let search_results: [Course]
    
    // 手动映射键名
    enum CodingKeys: String, CodingKey {
        case meta
        case search_results = "search-results"
    }
}

方法2:配置JSONDecoder的键解码策略

如果你有大量类似的连字符键需要转换为下划线格式属性,可以全局配置JSONDecoder的解码策略,让它自动完成转换:

let decoder = JSONDecoder()
// 自定义策略:将连字符分隔的JSON键转为下划线分隔的属性名
decoder.keyDecodingStrategy = .custom { keys in
    let originalKey = keys.last!.stringValue
    let convertedKey = originalKey.replacingOccurrences(of: "-", with: "_")
    return CodingKey(stringValue: convertedKey)!
}

// 使用配置好的解码器解析
let courses = try? decoder.decode(PagedCourses.self, from: data)

额外提示:你定义的Meta和Course内部的CodingKeys是多余的——当属性名与JSON键完全一致时,编译器会自动生成对应的编码/解码逻辑,直接删除这些冗余代码能让结构更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:34