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

Swift中JSON解码失败求助:响应字符串正常但转结构体报错

问题解决:JSON解码自定义结构体失败

错误原因

解码失败核心有两个问题:

  1. 结构体中本地生成的id(UUID类型)在服务端返回的JSON里没有对应字段,默认JSONDecoder会尝试解码所有结构体属性,找不到对应key就会报错。
  2. 手动实现了init方法,导致Swift无法自动合成Decodable所需的默认解码逻辑。

修正方案

1. 修正数据模型

通过CodingKeys指定需要解码的字段,忽略本地生成的id:

struct ImageDataModel: Decodable, Identifiable {
    var id = UUID()
    var created: Int
    var data: [ImageData]

    struct ImageData: Decodable, Identifiable {
        var id = UUID()
        var url: String
        
        private enum CodingKeys: String, CodingKey {
            case url
        }
    }
    
    private enum CodingKeys: String, CodingKey {
        case created, data
    }
}

如果项目支持iOS 16+/macOS 13+,可以用更简洁的@IgnoreCoding注解:

struct ImageDataModel: Decodable, Identifiable {
    @IgnoreCoding var id = UUID()
    var created: Int
    var data: [ImageData]

    struct ImageData: Decodable, Identifiable {
        @IgnoreCoding var id = UUID()
        var url: String
    }
}

2. 完善客户端解码逻辑

避免强制解包data,同时打印具体错误信息方便排查:

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    if let error = error {
        print("请求错误: \(error)")
        return
    }
    
    guard let data = data else {
        print("未获取到响应数据")
        return
    }
    
    do {
        let imageData = try JSONDecoder().decode(ImageDataModel.self, from: data)
        print(imageData)
    } catch {
        print("解码错误: \(error.localizedDescription)")
        print("详细错误信息: \(error)")
    }
}
task.resume()

关键说明

  • 移除自定义的init方法,让Swift自动合成Decodable的解码逻辑,确保解码器能正确映射JSON字段到结构体属性。
  • 本地生成的属性(如id)必须明确告诉解码器忽略,否则会触发解码错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:46:29