Ollie 的回答绝对是解决这种情况的最佳方式,但它确实将一些知识推送给了调用者,这可能是不可取的。它也不是很灵活。我仍然认为这是一个很好的答案,并且正是您想要的,但这是探索自定义结构编码的一个很好的简单示例。
我们怎样才能使它正常工作:
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)
}
}
但我绝对会按照 Ollie 的方式来解决这个问题。
有关这方面的更多信息,请参阅编码和解码自定义类型。