奥利的答案肯定是去这种情况下,最好的办法,但它确实推动了一些知识到调用,这可能是不可取的。它也不是很灵活。我仍然认为这是一个很好的答案,正是你想要的,但这是探索定制结构编码的一个很好的简单例子。
我们怎样才能使这项工作正确:
let user = try? JSONDecoder().decode(User.self, from: json)
我们不能使用默认的不合格了。我们必须建立我们自己的解码器。这有点乏味,但并不困难。首先,我们需要对结构编码成CodingKeys:
struct User {
let id: Int
let username: String
enum CodingKeys: String, CodingKey {
case user // The top level "user" key
}
// The keys inside of the "user" object
enum UserKeys: String, CodingKey {
case id
case username
}
}
这样,我们可以通过拉出嵌套集装箱手工解码User
:
extension User: Decodable {
init(from decoder: Decoder) throws {
// Extract the top-level values ("user")
let values = try decoder.container(keyedBy: CodingKeys.self)
// Extract the user object as a nested container
let user = try values.nestedContainer(keyedBy: UserKeys.self, forKey: .user)
// Extract each property from the nested container
id = try user.decode(Int.self, forKey: .id)
username = try user.decode(String.self, forKey: .username)
}
}
但我绝对做奥利的方式对于这个问题。
关于这方面的更多信息,请参阅Encoding and Decoding Custom Types。
我并没有深入研究'Codable'协议,但我认为最快的方法是直接用内部字典初始化'User'对象。你可以从用户字段中通过从字典中访问'userDicitonary'吗? –
如果您的JSON只包含单个用户的数据,您是否真的需要用户密钥和用户字典作为值?仅仅拥有用户字典是不够的?上下文不应该表明JSON描述了一个用户? – Palle
@Palle不幸的是,你并不总是选择你需要处理的数据格式。 –