比方說,我們有一個JSON結構如下內容(在火力地堡的實時數據庫常用):扁平化JSON當密鑰,只知道在運行時
{
"18348b9b-9a49-4e04-ac35-37e38a8db1e2": {
"isActive": false,
"age": 29,
"company": "BALOOBA"
},
"20aca96e-663a-493c-8e9b-cb7b8272f817": {
"isActive": false,
"age": 39,
"company": "QUONATA"
},
"bd0c389b-2736-481a-9cf0-170600d36b6d": {
"isActive": false,
"age": 35,
"company": "EARTHMARK"
}
}
預期的解決方案:
使用Decodable
我會喜歡將其轉換成3個元素的數組:
struct BoringEntity: Decodable {
let id: String
let isActive: Bool
let age: Int
let company: String
init(from decoder: Decoder) throws {
// ...
}
}
let entities: [BoringEntity] = try! JSONDecoder()...
的ID屬性對應於JSON對象的RO字符串,例如:18348b9b-9a49-4e04-ac35-37e38a8db1e2
。
解決方法:
我已經嘗試過多種方法,但無需輔助實體(或者使用選配)不能得到id屬性:
/// Incomplete BoringEntity version to make Decodable conformance possible.
struct BoringEntityIncomplete: Decodable {
let isActive: Bool
let age: Int
let company: String
}
// Decode to aux struct
let decoded = try! JSONDecoder().decode([String : BoringEntityIncomplete].self, for: jsonData)
// Map aux entities to BoringEntity
let entities = decoded.map { BoringEntity(...) }
使用init(from: Decoder)
並不像小事在其他情況下,由於密鑰未知,因此不能使用keyedContainer(,)
。
是Decodable
不適合這些類型的案件?前
我後來添加的註釋來解釋其中的id屬性是從哪來的,明知它將使JSON無效 – nathan
所以'id'是,例如。 '18348b9b-9a49-4e04-ac35-37e38a8db1e2'? –
確實。我會編輯我的問題,以清除而不使json示例失效 – nathan