【发布时间】:2018-06-28 09:52:08
【问题描述】:
我想使用 Codable 解析这个 json 输出:
{
"success": true,
"total": 1,
"users": [
{
"user": {
"id": "1",
"fname": "admin",
"lname": "admin",
"login": "admin",
"actif": "0",
"last_connection_date": "2018-01-18 16:02:34"
}
}
],
"msg": ""
}
我只是想从中提取用户的信息。 我的用户模型
import RealmSwift
class User: Object, Codable {
@objc dynamic var id: String = ""
@objc dynamic var fname: String = ""
@objc dynamic var lname: String = ""
@objc dynamic var login: String = ""
// private enum CodingKeys : String, CodingKey {
// case id = "users[0].user.id"
// case fname = "users[0].user.fname"
// case lname = "users[0].lname"
// case login = "users[0].user.login"
// case password = "users[0].user.password"
// }
}
// Somewhere in my code
Alamofire.request(Path.userInformations(id: userId).rawValue).
responseJSON(completionHandler: { response in
do {
let user = try JSONDecoder().decode(User.self, from: response.data!)
} catch (let error) {
print(error.localizedDescription)
}
})
我已尝试提取用户的对象,但未能成功将其转换为 Data 以将其提供给 JSONDecoder().decode() 方法。
回应 Vishal16 的评论
我已经尝试过你的第一种方法。它似乎不起作用,因为我认为用户对象之前的关键字“用户”。我尝试添加一个包装用户对象的新结构,但没有解决它。
struct ResponseBody : Codable {
var success : Bool?
var total : Int?
var users : [UserHolder]?
var msg : String?
var query_start : String?
var query_end : String?
var query_time : String?
var paging : Bool?
}
struct UserHolder : Codable {
var user: User?
enum CodingKeys: String, CodingKey {
case user = "user"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
user = try values.decodeIfPresent(User.self, forKey: .user)
}
}
【问题讨论】:
-
将需要更多的上下文。你能分享一下
JSONDecoder().decode()这一行的代码吗? -
@Malik 我已经更新了我的初始帖子,提供了更多上下文(一个简单的 Alamofire 获取请求)
-
在
error.localizedDescription中打印什么 -
根据您提供的信息,您的
JSON中的user容器向下两层。但是在您的代码中,您将完整的 json 传递给期望 json 仅具有user容器的解码器 -
@UmairAamir
The data couldn’t be read because it is missing