2015-04-27 2 views
1

Использование swift 1.2, xcode 6.3 и IOS 8, Im пытается создать объект из json-ответа, используя класс NSJSONSerialization. ответ JSON является:объекты здания из ответа json с использованием NSJSONSerialization

[{ 
    "_id" : "5470def9e0c0be27780121d7", 
    "imageUrl" : "https:\/\/s3-eu-west-1.amazonaws.com\/myapi-static\/clubs\/5470def9e0c0be27780121d7_180.png", 
    "name" : "Mondo", 
    "hasVip" : false, 
    "location" : { 
    "city" : "Madrid" 
    } 
}, { 
    "_id" : "540b2ff281b30f3504a1c72f", 
    "imageUrl" : "https:\/\/s3-eu-west-1.amazonaws.com\/myapi-static\/clubs\/540b2ff281b30f3504a1c72f_180.png", 
    "name" : "Teatro Kapital", 
    "hasVip" : false, 
    "location" : { 
    "address" : "Atocha, 125", 
    "city" : "Madrid" 
    } 
}, { 
    "_id" : "540cd44581b30f3504a1c73b", 
    "imageUrl" : "https:\/\/s3-eu-west-1.amazonaws.com\/myapi-static\/clubs\/540cd44581b30f3504a1c73b_180.png", 
    "name" : "Charada", 
    "hasVip" : false, 
    "location" : { 
    "address" : "La Bola, 13", 
    "city" : "Madrid" 
    } 
}] 

объект класса (Club.swift) с реализацией NSJSONSerialization.JSONObjectWithData является:

class Club: NSObject { 

    var id: String = "" 
    var name: String = "" 
    var imageUrl: String = "" 
    var hasVip: Bool = false 
    var desc: String = "" 
    var location: [Location] = [] 

    init(JSONString: String) { 

     super.init() 

     var error : NSError? 
     let JSONData = JSONString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 

     let JSONDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(JSONData!, options: nil, error: &error) as! NSDictionary 

     self.setValuesForKeysWithDictionary(JSONDictionary as [NSObject : AnyObject]) 

    } 

} 

и, наконец, класс ApiClient является

class ApiClient { 
    func getList(completionHandler: ([JSON]) ->()) { 
     let URL = NSURL(string: "https://myapi.com/v1/clubs") 
     let mutableURLRequest = NSMutableURLRequest(URL: URL!) 

     mutableURLRequest.setValue("Content-Type", forHTTPHeaderField: "application/json") 
     mutableURLRequest.HTTPMethod = "GET" 
     mutableURLRequest.setValue("Bearer R01.iNsG3xjv/r1LDkhkGOANPv53xqUFDkPM0en5LIDxx875fBjdUZLn1jtUlKVJqVjsNwDe1Oqu2WuzjpaYbiWWhw==", forHTTPHeaderField: "Authorization") 

     let manager = Alamofire.Manager.sharedInstance 
     let request = manager.request(mutableURLRequest) 

     request.responseJSON { (request, response, json , error) in 
      if (json != nil){ 
       var jsonObj = JSON(json!) 
       if let data = jsonObj["hits"].arrayValue as [JSON]?{ 

        var aClub : Club = Club(JSONString: data) 

        println(aClub.name) 

        completionHandler(data) 
       } 
      } 
     } 
    } 
} 

, но проблема в том, когда я пытаюсь Println (aClub.name) ошибка

«не может ссылаться на инициализатор для type'Club» со списком аргументов типа (JSONString [JSON]) "

Я не знаю, как я мог бы использовать класс NSJSONSerialization со сложным ответом JSON.

ответ

2

jsonObj будет представлять собой объект SwiftyJSON или что-то в этом роде, которое используется вместо NSJSONSerialization, а не в связи с этим. Переменная data представляет собой массив объектов JSON (т. Е. Это [JSON]), а не строка.

Но вы используете метод responseJSON Alamofire, который выполняет JSON для вас. Поэтому вам не нужно использовать либо NSJSONSerialization, либо SwiftyJSON. Он уже разбирает его в массив словарей.

Если вы хотите массив Club объектов, вы могли бы сделать, можно просто перебирать этот массив, строительство Club объектов из словарей:

class ApiClient { 
    func getList(completionHandler: ([Club]?, NSError?) ->()) { 
     let URL = NSURL(string: "https://myapi.com/v1/clubs") 
     let mutableURLRequest = NSMutableURLRequest(URL: URL!) 

     mutableURLRequest.setValue("Content-Type", forHTTPHeaderField: "application/json") 
     mutableURLRequest.HTTPMethod = "GET" 
     mutableURLRequest.setValue("Bearer R01.iNsG3xjv/r1LDkhkGOANPv53xqUFDkPM0en5LIDxx875fBjdUZLn1jtUlKVJqVjsNwDe1Oqu2WuzjpaYbiWWhw==", forHTTPHeaderField: "Authorization") 

     let manager = Alamofire.Manager.sharedInstance 
     let request = manager.request(mutableURLRequest) 

     request.responseJSON { (request, response, json, error) in 
      var clubs = [Club]() 
      if let arrayOfDictionaries = json as? [[String: AnyObject]] { 
       for dictionary in arrayOfDictionaries { 
        clubs.append(Club(dictionary: dictionary)) 
       } 
       completionHandler(clubs, nil) 
      } else { 
       completionHandler(nil, error) 
      } 
     } 
    } 
} 

Вы, очевидно, придется изменить Club для обработки объекта словаря:

class Club { 

    var id: String! 
    var name: String! 
    var imageUrl: String! 
    var hasVippler: Bool! 
    var location: [String: String]! 

    init(dictionary: [String: AnyObject]) { 
     id   = dictionary["_id"] as? String 
     name  = dictionary["name"] as? String 
     imageUrl = dictionary["imageUrl"] as? String 
     hasVippler = dictionary["hasVip"] as? Bool 
     location = dictionary["location"] as? [String: String] 
    } 
} 

Наконец, ваш контроллер представления таблицы может вызвать API:

let apiClient = ApiClient() 

var clubs: [Club]! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    apiClient.getList() { clubs, error in 
     if clubs != nil { 
      self.clubs = clubs 
      self.tableView.reloadData() 
     } else { 
      println(error) 
     } 
    } 
} 
+0

Извините Роб, но вызов «ApiClient.getList() {clubs, error in ...» дает мне эту ошибку «Невозможно вызвать getList с помощью списка аргументов типа ((_, _) -> _)» – Edu

+0

Роб, возвращаясь к этой теме, ответ json после request.responseJSON представляет собой массив ** ["hits"] **, но println (arrayOfDictionaries) пуст. Обратите внимание, что ответ JSON, который я напечатал сверху, представляет собой массив JSON после того, как ** let data = jsonObj ["hits"]. ArrayValue как [JSON]? **, потому что в этой строке я извлекаю ** ["хиты" ] ** значение ответа JSON – Edu

+0

Извините, Роб, я не очень хорошо объясняю, не используя swiftyjson, ответ json - это массив ударов, но когда я пытаюсь преобразовать его в [string: anyObject], то arrayOfDictionaries пуст. – Edu

Смежные вопросы