使用URLSession调用API时JSON响应无法解析的问题排查
问题:URLSession解析API响应报错"The data couldn’t be read because it isn’t in the correct format"
使用URLSession调用API时,出现错误提示The data couldn’t be read because it isn’t in the correct format,可打印响应字符串但无法完成JSON解析。以下是相关代码、模型定义及响应内容:
API调用方法
func getDashboardCountReq() { guard let url = URL(string: urlString) else { return } var request = URLRequest(url: url) request.httpMethod = "GET" request.addValue("application/json", forHTTPHeaderField: "content-type") let userDetails = UserInfo.shared.getCurrentUserDetails() if let authToken = userDetails?.authToken { let headers = ["Content-Type": "application/json", "Authorization": "Bearer " + authToken] request.allHTTPHeaderFields = headers } URLSession.shared.dataTask(with: request) { (data,response,error) in do { if let data = data { let responseString = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) print("responseString \(responseString)") do { let f = try JSONDecoder().decode([DashboardResponseData].self, from: data) print(f.count) } catch { print("1232 \(error.localizedDescription)") } } else { print("LoginViewModel-> no data found") } } catch(let error) { print("Error A123 \(error.localizedDescription)") } }.resume() }
模型定义
struct DashboardResponseData: Codable, Identifiable { let id = UUID() var approvedrc: String var pendingpo: String? var assets: String? var approvedprs: String? var pendingrc: String? var approvedpo: String? var pendingprs: String? var tickets: String? enum CodingKeys: String, CodingKey { case approvedrc = "approvedrc" case pendingpo = "pendingpo" case approvedprs = "approvedprs" case pendingrc = "pendingrc" case approvedpo = "approvedpo" case pendingprs = "pendingprs" case tickets = "tickets" } }
API响应字符串
[{"approvedrc":41,"pendingpo":566,"assets":37956,"approvedprs":1040,"pendingrc":8,"approvedpo":1650,"pendingprs":1709,"tickets":137872}]
错误日志
日志显示核心错误信息:The data couldn’t be read because it isn’t in the correct format
解决方案
1. 修正模型属性类型
API响应中所有字段值均为整数类型(如approvedrc:41),但模型里将这些字段定义为String类型,JSONDecoder无法直接将整数解析为字符串,这是报错的核心原因。需将模型属性类型全部改为Int或可选Int?:
struct DashboardResponseData: Codable, Identifiable { let id = UUID() var approvedrc: Int var pendingpo: Int? var assets: Int? var approvedprs: Int? var pendingrc: Int? var approvedpo: Int? var pendingprs: Int? var tickets: Int? enum CodingKeys: String, CodingKey { case approvedrc, pendingpo, assets, approvedprs, pendingrc, approvedpo, pendingprs, tickets } }
2. 处理UUID的Codable兼容
id是自动生成的UUID,API响应中无此字段,当前的CodingKeys已排除id(枚举未包含该字段),无需额外修改。若后续出现id相关解码错误,可给id添加@Codable注解或在init(from decoder:)方法中手动生成。
3. 优化错误调试(可选)
若需精准定位解码问题,可将打印error.localizedDescription改为打印完整错误信息,方便排查具体字段的类型不匹配问题:
catch { print("解码错误详情:\(error)") }
内容的提问来源于stack exchange,提问作者user10469417
相关产品推荐
相关产品推荐

