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

Swift JSON解析报错求助:Rest API响应解析失败

解决Swift中Rest API JSON解析的DataCorrupted错误

嘿,我看到你在解析Rest API返回的JSON时碰到了这个头疼的崩溃问题,别担心,我们一步步来排查解决!

先明确下你遇到的核心问题:fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.dataCorrupted(...) 这个错误本质是你从API拿到的数据根本不是有效的JSON格式,所以JSON解码器完全没法处理它。

下面是具体的排查和解决步骤:

1. 先看清楚API返回的原始内容到底是什么

很多时候API不会按预期返回JSON——比如服务器出错时返回HTML错误页面(404/500页面)、数据编码不对、或者返回内容里混了额外字符。你可以在解码前先把拿到的Data转成字符串,看看真实返回:

// 在调用JSONDecoder解码之前,先加这段代码打印原始数据
if let responseString = String(data: yourResponseData, encoding: .utf8) {
    print("API返回的原始内容:\n\(responseString)")
}

这一步是关键!如果打印出<html>标签,说明服务器返回了错误页面;如果是乱码,可能是编码问题;如果是JSON格式但有语法错误(比如少逗号、引号不配对),也能一眼看出来。

2. 检查你的请求是否符合API要求

  • 确认请求URL、HTTP方法(GET/POST等)是否正确,有没有遗漏必要的Header(比如Content-Type: application/json)
  • 如果是POST请求,检查你发送的请求体格式、字段名是否和API文档一致

3. 把不安全的try!换成do-catch捕获错误

你现在用try!会直接导致App崩溃,换成do-catch不仅能避免崩溃,还能拿到更详细的错误细节:

do {
    let decodedData = try JSONDecoder().decode(YourModel.self, from: yourResponseData)
    // 处理解码后的数据
} catch {
    print("解码错误详情:\(error)")
    // 进一步拆解解码错误的具体类型
    if let decodingError = error as? DecodingError {
        switch decodingError {
        case .dataCorrupted(let context):
            print("数据损坏详情:\(context.debugDescription),路径:\(context.codingPath)")
        case .keyNotFound(let key, let context):
            print("找不到Key:\(key),上下文:\(context.debugDescription)")
        case .typeMismatch(let type, let context):
            print("类型不匹配:\(type),上下文:\(context.debugDescription)")
        case .valueNotFound(let type, let context):
            print("值缺失:\(type),上下文:\(context.debugDescription)")
        default:
            print("其他解码错误")
        }
    }
}

4. 确认你的Model和JSON格式完全匹配

等你确认API返回的是有效JSON后,再检查Model结构:

  • 确保Model的属性名和JSON的key完全一致(如果不一致,可以用CodingKeys做映射)
  • 确保属性类型和JSON中的值类型匹配(比如JSON里是字符串,你Model里写成Int就会报错)
  • 可选字段要声明为可选类型(加?),避免因为字段缺失导致解码失败

几个常见的坑要注意

  • 编码问题:如果转字符串时出现乱码,试试用.utf16或.isoLatin1编码解析
  • 压缩数据:有些API会返回gzip压缩的数据,你需要先解压再解码
  • 重定向问题:如果请求触发了302重定向,可能会拿到跳转后的HTML页面而非JSON

你先从打印原始响应内容开始排查,大部分情况下都能直接找到问题根源!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:29:50