gpt4 book ai didi

json - 将 json 输出解码为模型

转载 作者:行者123 更新时间:2023-11-30 11:50:44 26 4
gpt4 key购买 nike

我想使用 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 的评论

我已经尝试过你的第一种方法。它似乎不起作用,因为我认为在用户对象之前有关键字“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)
}
}

最佳答案

我认为你的响应类结构应该是这样的:

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
}

#编辑

如果您不想解析对 JSON 对象的完整响应

  1. 首先使用以下方法将数据转换为 JSON 对象

    让 jsonResponse = 尝试 JSONSerialization.jsonObject(with: data, options: .mutableContainers) as!字典

  2. 获取用户列表字符串 JSON,然后将其转换为数据,然后将数据转换为用户列表对象

    如果让responseBody = jsonResponse["users"] {

    let dataBody = (responseBody as!String).data(using: .utf8)!if let obj = Utils.convertToArray(data: dataBody) { print(obj)//用户 obj 列表}}

Hear是上面实现中使用的方法

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 上运行良好。请看下面的截图

1. enter image description here

2. enter image description here

3. enter image description here

将 json 输出解码为模型

enter image description here

结果:

enter image description here

关于json - 将 json 输出解码为模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48336298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com