2017-10-10 83 views
1

嵌套陣列採取以下JSON:解碼迅速4

let rawJson = 
""" 
[ 
     { 
      "id": 1, 
      "name":"John Doe" 
     }, 
     { 
      "id": 2, 
      "name":"Luke Smith" 
     }, 
] 
""" 

User模型:

struct User: Decodable { 
    var id: Int 
    var name: String 
} 

這是很簡單的解碼,像這樣:

let data = rawJson.data(using: .utf8) 
let decoder = JSONDecoder() 
let users = try! decoder.decode([User].self, from: data!) 

但如果JSON看起來像這樣,頂層是字典並需要獲取數組users

let json = 
""" 
{ 
    "users": 
    [ 
     { 
      "id": 1, 
      "name":"John Doe" 
     }, 
     { 
      "id": 2, 
      "name":"Luke Smith" 
     }, 
    ] 
} 
""" 

閱讀JSON最有效的解決方案是什麼?我肯定可以創建另一個struct這樣的:

struct SomeStruct: Decodable { 
    var posts: [Post] 
} 

和解碼像這樣:

let users = try! decoder.decode(SomeStruct.self, from: data!) 

,但感覺不對做這樣的說法,創建一個新的模型對象,只是因爲數組是嵌套在字典中。

+1

檢查本條規定的「包裝鍵」的標題。看來,這是解析該結構的正確方法。 http://benscheirman.com/2017/06/ultimate-guide-to-json-parsing-with-swift-4/ –

回答

2

如果你想利用JSONDecoder你必須創建一個嵌套的結構(ure)。

我推薦使用的名稱Root根對象,並把孩子變成結構Root

struct Root : Decodable { 

    struct User : Decodable { 
     let id: Int 
     let name: String 
    } 

    let users : [User] 
} 

let json = """ 
{ 
    "users": [{"id": 1, "name":"John Doe"}, 
       {"id": 2, "name":"Luke Smith"}] 
} 
""" 

let data = Data(json.utf8) 
do { 
    let root = try JSONDecoder().decode(Root.self, from: data) 
    print(root.users) 
} catch { 
    print(error) 
} 
+0

沒有必要將User結構嵌套到Root結構struct User:Decodable { 讓ID:詮釋 讓名:字符串 } 結構根:可解{ 讓用戶:[用戶] }'結果將是相同 –

+1

是沒有必要的,但如果結構不使用別的地方它更清潔(imho),它說明了JSON結構的等價物。 – vadian