2016-06-30 11 views
0

JSONを解析してSwift辞書に変換する必要があるとします。以下に気付いた場合、その型はかなり入れ子になっています。ネストされた配列などの別のマップである値を持つアカウントキーがあります。私はAnyObjectを示唆する多くの記事を見てきましたか?またはAny?これを行う正しい方法は何ですか?完全な例が素晴らしいでしょう。私はAlamofire/SwiftyJSONを使用しています。ありがとう!SwiftでJSONのネストされた型で辞書を表現する方法

{ 
     "id": "20o2k2jlkja08a08", 
     "username": "catlover", 
     "accounts": { 
      "verified_email": "false", 
      "identities": [{ 
       "network": "facebook", 
       "token": "alkdjlaksjsak", 
       "avatar": "avatarUrl" 
      }, { 
       "network": "twitter", 
       "token": "alkdjlaksjsak", 
       "avatar": "avatarUrl" 
      }] 
     }, 
     "followers": "100", 
     "following": "20" 
    } 
+1

最良の方法は、そのJSONにマップされ、辞書で初期化できるモデルクラス/構造体を作成することです。 – Cristik

答えて

1

私はCocoapodsに利用できる両方、あなたはObjectMapperAlamofireObjectMapperフレームワークを見てすることをお勧めします。それらを使用すると、JSONからSwiftのオブジェクトにマッピングするのは簡単です。

まず、あなたのオブジェクトにどのようにJSONマップを定義します。

import ObjectMapper 

class User: Mappable { 
    var id: String? 
    var username: String? 
    var accounts: UserAccount? 
    var followers: Int? 
    var following: Int? 

    required init?(_ map: Map) { /* validate your JSON, etc */ } 

    func mapping(map: Map) { 
     self.id   <- map["id"] 
     self.username <- map["username"] 
     self.accounts <- map["accounts"] 
     self.followers <- map["followers"] 
     self.following <- map["following"] 
    } 
} 

class UserAccount: Mappable { 
    var verifiedEmail: Bool? 
    var identities: [UserIdentity]? 

    required init?(_ map: Map) { } 

    func mapping(map: Map) { 
     self.verifiedEmail <- map["verified_email"] 
     self.identities  <- map["identities"] 
    } 
} 

class UserIdentity: Mappable { 
    var network: String? 
    var token: String? 
    var avatar: NSURL? 

    required init?(_ map: Map) { } 

    func mapping(map: Map) { 
     self.network <- map["network"] 
     self.token  <- map["token"] 
     self.avatar  <- (map["avatar"], URLTransform()) 
    } 
} 

使用法:

Alamofire.request(.GET, url) 
    .responseObject { (response: Response<User, NSError>) in 
     let user = response.result.value 

     // Get the url to the user's avatar 
     let avatarURL = user?.accounts?.identities?.first?.avatar 
    } 

あなたはこれらすべての?を避けたい場合は、単にあなたのプロパティのデフォルト値を与えます。もちろん、プロパティがJSONに存在することが保証されている場合にのみ意味があります。

class User: Mappable { 
    var id = "" 
    var username = "" 
    var accounts = UserAccount() 
    var followers = 0 
    var following = 0 

    ... 
} 
+0

ありがとう! < - 構文とは何ですか? – demig0d

+0

「マッピング演算子」と呼ぶことができます。これは標準のSwift演算子ではなく、 'ObjectMapper'フレームワークで定義されたカスタム演算子です –

0

独自のクラス構造にJSONドキュメントの配列/ディクショナをマッキングする必要があります。このような何かが...

public class Identity 
{ 
    public var network: String 
    public var token: String 
    public var avatarURI: NSURL 
} 

public class Account 
{ 
    public var verifiedEmail: Bool 
    public var identities: [Identity] 
} 

public class Profile 
{ 
    public var profileID: String 
    public var userName: String 
    public var accounts: [Account] 
    public var followers: Int 
    public var following: Int 
} 
関連する問題