假设我有以下User对象:
struct User: Codable {
let id: Int
}
并从API获取以下json:
{
"user": {
"id": "22"
}
}
很明显,可编码用户不会解析。除了创建包装对象之外,还有其他方法吗?谢谢。
编辑:我对包装器有一些答案-我知道这种方法,但是我对替代方法感到好奇。
答案 0 :(得分:2)
两个错误:缺少根对象,并且v-on:logout="do_logout_method()"
v-on:login="do_login_method()"
的类型为id
(请注意双引号)。
使用String
,您必须始终从顶部解析JSON
Codable
或者解码为字典,但这使得struct Root : Codable {
let user : User
}
struct User : Codable {
let id: String
}
的使用毫无意义。
答案 1 :(得分:2)
您可以在containers
中使用 Codable
来获取nested data from JSON
。
容器=不需要包装对象
struct User: Decodable {
var id: Int
enum CodingKeys: String, CodingKey {
case user, id
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let user = try values.nestedContainer(keyedBy: CodingKeys.self, forKey: .user)
let idStr = try user.decode(String.self, forKey: .id)
id = Int(idStr) ?? 0
}
}
使用containers
,您可以使用id
存储single object
的值,而不用创建任何wrapper object
。
注意:在JSON
示例中,您提供的id
类型为String
。但是在struct
定义中,您使用的是id
类型的Int
。我给出的代码是在转换String to Int
之后。如果您有错字,请按原样使用string
值。
建议-将id
用作Int?
,而不是Int
。最好不要存储任何值,而不要存储垃圾值(例如,本例中为0)
答案 2 :(得分:0)
最简单的JSON模型:
import Foundation
// MARK: - UserModel
struct UserModel: Codable {
let user: User
}
// MARK: - User
struct User: Codable {
let id: String
}