嵌套的 Json 数据不会使用 Swift 语言解码吗?



我从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。


如果没有映射,则模型的属性名称和解码的json属性名称必须相等,因此使用更改结构

struct response: Codable {
let token: String?
let details: userDto?
}

这当然不起作用,首先,在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

最新更新