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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:20:31