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

使用Decodable结构体数组及Packages结构体时出现解码错误求助

解决Decodable结构体作为数组类型时的解码不兼容问题

嘿,我碰到过好几次这种情况!你明明给Packages加了Decodable标记,但把它作为另一个结构体的数组类型使用时,却跳出「does not conform to Decodable」的报错,对吧?咱们来一步步揪出问题所在:

可能的报错原因

  • 隐藏的非Decodable属性:你提供的Packages代码只显示了部分属性(末尾的...说明还有省略),如果省略的属性里引用了没有遵循Decodable的自定义类型,那整个Packages结构体就没法满足协议要求。比如要是有个let customInfo: MyUncodableStruct,但MyUncodableStruct没加Decodable,就会触发这个错误。
  • 字段名与JSON不匹配:Swift默认会自动把驼峰命名(比如你的idService)转成蛇形命名(id_service)去匹配JSON,但如果JSON里的字段名有特殊格式(比如带下划线的非标准命名),自动合成的Decodable实现会直接失败,却可能抛出“不遵循Decodable”的模糊错误。
  • 包含数组的结构体本身有问题:假设你有个类似struct Service: Decodable { let packages: [Packages] }的结构体,要是Service本身没加Decodable,或者Service里其他属性不符合Decodable要求,错误可能会转嫁到Packages上,让你误以为是数组类型的问题。

针对性解决方案

1. 补全所有属性的Decodable合规性

把Packages里省略的属性全部列出来,确保每个属性的类型满足以下任一条件:

  • 是Swift基础类型(Int、String、Bool、Double等,这些本身自带Decodable实现)
  • 是可选类型(比如String?,可选的Decodable类型会自动遵循协议)
  • 是自定义类型,但必须也标记为Decodable(或更通用的Codable)

2. 手动添加CodingKeys匹配字段名

如果JSON字段名和结构体属性名不匹配,手动定义CodingKeys枚举来映射:

struct Packages: Decodable {
    let id: Int
    let name: String
    let idService: Int
    let nationality: String
    // ... 其他属性
    
    enum CodingKeys: String, CodingKey {
        case id, name, nationality
        case idService = "id_service" // 假设JSON里是id_service
        // 其他不匹配的字段都在这里一一映射
    }
}

3. 确保包含数组的结构体也遵循Decodable

比如包含[Packages]的结构体必须明确标记Decodable,且自身所有属性都合规:

struct ServiceResponse: Decodable {
    let code: Int
    let message: String
    let packages: [Packages] // 只要Packages合规,这里就不会报错
}

4. 用调试代码定位具体错误

如果还是找不到问题,用do-catch块捕获详细的解码错误,能直接看到是哪个字段出了问题:

let jsonData = // 你的JSON数据
do {
    let response = try JSONDecoder().decode(ServiceResponse.self, from: jsonData)
    print("解码成功:\(response)")
} catch {
    print("解码失败:\(error)")
    // 打印更详细的错误细节,比如哪个key找不到
    if let decodeError = error as? DecodingError {
        print("详细错误信息:\(decodeError)")
    }
}

内容的提问来源于stack exchange,提问作者mrs.tat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:41:06