奧利的答案肯定是去這種情況下,最好的辦法,但它確實推動了一些知識到調用,這可能是不可取的。它也不是很靈活。我仍然認爲這是一個很好的答案,正是你想要的,但這是探索定製結構編碼的一個很好的簡單例子。
我們怎樣才能使這項工作正確:
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不幸的是,你並不總是選擇你需要處理的數據格式。 –