2016-06-30 2 views
0

Предположим, что я разбираю JSON и должен преобразовать его в словарь Swift. Если вы заметили ниже, тип довольно вложен. Существует ключ учетных записей со значением, которое является другой картой, с вложенными массивами и т. Д. Я видел много сообщений, которые предлагают AnyObject? или любой? Каков правильный способ сделать это? Полный пример был бы замечательным. Я использую 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

Я рекомендую вам посмотреть на ObjectMapper и AlamofireObjectMapper рамки, оба доступны на Cocoapods. С ними сопоставление с 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 Array/Dictionary в своей собственной структуре классов. Что-то вроде этого ...

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 
} 
Смежные вопросы