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
相关产品推荐
相关产品推荐

