如何解决swift中标准嵌套JSON的可解码包装器
我正在使用一个遵循非常相似的响应结构的 API:
{
"error": "string item","success": true,"result": {
"users" : [
{
"id": "20001","firstname": "John","lastname" : "Smith","address": "123 king street","email": "john.smith@gmail.com","mobile": "0412345678"
},{
"id": "20002","firstname": "Jack","lastname": "Master","address": "123 rainbow road","email": "jack.master@gmail.com","mobile": "0412345678"
}
]
}
}
api 根据端点返回不同的结果。我想创建一个标准的可解码 json 响应结构。然后我只是为每个不同的结果类型创建一个新的可解码结构。
这样的事情是理想的:
struct JSONResponse<T: Decodable>: Decodable {
var error: String
var success: Bool
var result: T
}
这是我想要做的
struct User: Decodable {
var id: String
var firstName: String
var lastName: String
var email: String
enum CodingKeys: String,CodingKey {
case users
}
enum UserKeys: String,CodingKey {
case id,firstName = "firstname",lastName = "lastname",email,mobile
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let nestedContainer = try container.nestedContainer(keyedBy: UserKeys.self,forKey: .users)
id = try nestedContainer.decode(String.self,forKey: .id)
firstName = try nestedContainer.decode(String.self,forKey: .firstName)
lastName = try nestedContainer.decode(String.self,forKey: .lastName)
email = try nestedContainer.decode(String.self,forKey: .email)
}
}
然后以这样的方式解码许多不同的响应
let res = try! JSONDecoder().decode(JSONResponse<User>.self,from: responseData!)
解决方法
在这种特定情况下,您有多个 User
对象,因此您需要某种容器:
struct Users: Decodable {
var users: [User]
}
User
也不需要这么复杂:
struct User: Decodable {
var id: String
var firstName: String
var lastName: String
var email: String
}
然后解码为:
let users = JSONDecoder().decode(JSONResponse<Users>.self,from: responseData)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。