我正在從 API 接收回應資料,當我嘗試使用 json 解碼器對其進行解碼時,嵌套的 json 資料將不會被解碼,因為它回傳 null。
json資料如下:
{
"token": "string",
"details": {
"ID": "string",
"Name": "string",
"Message": null
}
}
解碼模型為:
struct response: Codable {
let token: String?
let usrData: userData?
}
struct userData:Codable{
let ID,Name,Message: String?
}
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data, error == nil else {
completion(.failure(.custom(errorMessage: "Please check internet connection")))
return
}
guard let loginResponse = try? JSONDecoder().decode(response.self, from:data) else
{
completion(.failure(.invalidCredentials))
return
}
print(loginResponse.userData?.userID as Any) //returns nil
print(loginResponse.token) //token printed
guard let token = loginResponse.token else {
completion(.failure(.invalidCredentials))
return
}
completion(.success(token))
}.resume()
回應中的令牌將被成功解碼,但 userData 回傳 null。
uj5u.com熱心網友回復:
如果您不是映射,則模型的屬性名稱和解碼的 json 屬性名稱必須相等,因此請使用以下命令更改您的結構:
struct response: Codable {
let token: String?
let details: userDto?
}
uj5u.com熱心網友回復:
這肯定行不通,首先,在你的response結構中,你有一個 let 變數,它說usrData不能被識別為details. 其次,你寫usrData: userDto的是userDto你清楚地做錯了或忘記提及它。但是,例如這樣做:
struct Response: Codable {
let token: String?
let details: UserData?
}
struct UserData: Codable {
let ID,Name,Message: String?
}
let filePath = Bundle.main.path(forResource:"test", ofType: "json")
let data = try Data(contentsOf: URL(fileURLWithPath: filePath!))
if let loginResponse = try? JSONDecoder().decode(Response.self, from: data) {
loginResponse
}
該示例并不完全正確,因為fileURLWithPath已棄用,但您應該從中獲得想法。
我還建議遵循一些基本角色,比如Struct用大寫字母寫 s。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/519934.html
上一篇:回傳串列中平均評分最高的類別名稱
