2017-10-10 30 views
1

次JSONを取ることで、ネストされた配列を復号化するは、迅速な4

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 SomeStruct: Decodable { 
    var posts: [Post] 
} 

などのようにデコード:私は間違いなく、このように別のstructを作成することができ

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 structをネストする必要はありません。root struct 'struct User:Decodable { IDをお聞かせ ます。int てみましょう名前:文字列 } 構造体のルート:復号可能な{ は聞かせてユーザー:[ユーザー] } '結果は以下のようになり、同じ –

+1

はいそこ必要はありませんが、構造体は、どこか別の場所で使用されていない場合それはより洗練されており(imho)、JSON構造と同等のものを示しています。 – vadian