我想要使用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()
方法。
我先尝试过你。它似乎不起作用,因为我认为,在用户的对象之前,关键字“user”。我已经尝试添加一个包装用户对象的新结构,但是没有解决它。
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)
}
}
答案 0 :(得分:0)
class User: Object, Codable {
@objc dynamic var id: String = ""
@objc dynamic var fname: String = ""
@objc dynamic var lname: String = ""
@objc dynamic var login: String = ""
}
class Users: Object, Codable {
@objc dynamic var users: [User]
}
用于解码
let user = try JSONDecoder().decode(Users.self, from: response.data!)
我认为应该解决这个问题。
另一种方法是,您必须将response.data
转换为Dictionary
以挖掘到user
对象。
答案 1 :(得分:0)
我认为您的响应类结构应该是:
import Foundation
struct ResponseBody : Codable {
var status : Bool?
var total : Int?
var users : [User]? //list of users
var msg : String?
enum CodingKeys: String, CodingKey {
case status = "status"
case total = "total"
case users = "users"
case msg = "msg"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
status = try values.decodeIfPresent(Bool.self, forKey: . status)
total = try values.decodeIfPresent(Int.self, forKey: . total)
users = try values.decodeIfPresent([User].self, forKey: . users)
msg = try values.decodeIfPresent(String.self, forKey: . msg)
}
}
现在,您可以将JSON数据检索到对象
let jsonDecoder = JSONDecoder()
let response = try jsonDecoder.decode(ResponseBody.self, from: data)
for user in response.users {
// user object is here
}
<强> #edit 强>
如果您不想解析对JSON对象的完整响应
首先使用
将数据转换为JSON对象让jsonResponse =尝试使用JSONSerialization.jsonObject(带:data,options:.mutableContainers)!字典
获取用户列表字符串JSON,然后将其转换为数据,然后将该数据转换为用户列表对象
如果让responseBody = jsonResponse [“users”] {
让dataBody =(responseBody as!String).data(使用:.utf8)! if let obj = Utils.convertToArray(data:dataBody){ print(obj)//用户obj列表 } }
听到上述实现中使用的方法
class func convertToArray(data: Data) -> [AnyObject]? {
do {
return try JSONSerialization.jsonObject(with: data, options: []) as? [AnyObject]
} catch {
Constants.print(items: error.localizedDescription)
}
return nil
}
希望这对你有所帮助。快乐的编码:)
因此,您需要了解适合您的工作代码 它在我的Playground中运行良好。请参见下面的截图
将json输出解码为模型
结果: