我正在使用 URLSession 進行 API 呼叫,我收到如下錯誤:無法讀取資料,因為它的格式不正確我不知道為什么會這樣。即使我能夠以字串格式列印回應,但不會被決議。
API calling method
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"
}
}
字串回應
[{\"approvedrc\":41,\"pendingpo\":566,\"assets\":37956,\"approvedprs\":1040,\"pendingrc\":8,\"approvedpo\":1650,\"pendingprs\":1709,\"tickets\":137872}]
// 日志

uj5u.com熱心網友回復:
如前所述,您的資料是Int,并且您還缺少assetsCodingKeys 中的資料。嘗試這樣的事情:
struct DashboardResponseData: Codable, Identifiable {
let id = UUID()
let approvedrc, pendingpo, assets, approvedprs: Int?
let pendingrc, approvedpo, pendingprs, tickets: Int?
enum CodingKeys: String, CodingKey {
case approvedrc,pendingpo,assets,approvedprs,pendingrc,approvedpo,pendingprs,tickets
}
}
uj5u.com熱心網友回復:
中的所有值DashboardResponseData都宣告為字串,但在 JSON 中是整數,因此您應該將它們決議為Int,或者在 JSON 中為它們添加引號。
它在那里作業:
import Foundation
let json = "[{\"approvedrc\":41,\"pendingpo\":566,\"assets\":37956,\"approvedprs\":1040,\"pendingrc\":8,\"approvedpo\":1650,\"pendingprs\":1709,\"tickets\":137872}]"
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 = "approvedrc"
case pendingpo = "pendingpo"
case approvedprs = "approvedprs"
case pendingrc = "pendingrc"
case approvedpo = "approvedpo"
case pendingprs = "pendingprs"
case tickets = "tickets"
}
}
let f = try JSONDecoder().decode([DashboardResponseData].self, from: json.data(using: .utf8)!)
print(f.count)
另外,請注意,您可以簡化此操作:
let responseString = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
這完全是多余的(String.Encoding(rawValue: String.Encoding.utf8.rawValue))可以簡單地String.Encoding.utf8):
let responseString = String(data: data, encoding: .utf8)
因為列舉型別String.Encoding被扣除,因為它是這個引數的預期型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/521928.html
標籤:IOSjson迅速
