2017-02-16 11 views
1

Мне было интересно, как разобрать, получить все данные из API в Alamofire.Анализ синтаксиса словарей с помощью Alamofire 4.0 и Swfit 3

Вот код, который загружает только один словарь данных из API. Как я могу загрузить с него другие вещи?

Вот скриншот из JSONFormatter:

http://imgur.com/a/rhxBO

func downloadJsonData (completed: @escaping DownloadCompleted) { 
    Alamofire.request(url, method: .get).responseJSON { response in 
     let result = response.result.value 
     if let dict = result as? [Dictionary<String,AnyObject>] { 

      if let id = dict[0]["id"] as? String { 
       self._id = id 
       print("@@@\(self._id)") 
      } 

      if let name = dict[0]["name"] as? String { 
       self._name = name 
       print("@@@\(self._name)") 
      } 

      if let avatar = dict[0]["avatar"] as? String { 
       self._avatar = avatar 
       print("@@@\(self._avatar)") 
      } 

      if let lat = dict[0]["lat"] as? Float { 
       self._lat = lat 
       print("@@@\(self._lat)") 
      } 

      if let lng = dict[0]["lng"] as? Float { 
       self._lng = lng 
       print("@@@\(self._lng)") 
      } 
     } 
    } 
    completed() 
} 

ответ

3
func downloadJsonData (completed: @escaping DownloadCompleted) { 
    Alamofire.request(url, method: .get).responseJSON { response in 
     if let collectionData = response.result.value as? [[String:AnyObject]] { 
      let collection : [YourStruct] = collectionData.flatMap { data in 
       guard let id = data["id"] as? String, 
        let name = data["name"] as? String, 
        let avatar = data["avatar"] as? String, 
        let lat = data["lat"] as? Float, 
        let lng = data["lng"] as? Float 
       else { 
        return nil 
       } 

       return YourStruct(id:id, name:name, avatar:avatar, lat:lat, lng:lng) 
      } 
     } 
    } 
    completed() 
} 

А теперь у вас есть коллекция вашего объекта. И с ним вы можете делать то, что хотите

+0

хорошо я не может вернуть Struct. Это показывает мне ошибку в 4-й строке вашего кода, в которой говорится: «невозможно определить тип закрытия в текущем контексте» – Magnifique

+0

@Tonamini Посмотрите на мой исправленный ответ –

+0

Хм ... Это почти идеально, но он повторяет весь массив 10 раз .. когда я распечатываю collectionData, он показывает целую кучу словарей. Не знаю, как это исправить: O – Magnifique

1

Я предлагаю вам реализовать сопоставление с пользовательским объектом, это библиотека, которая поможет вам в этом и может быть интегрирована с Alamofire.

https://github.com/tristanhimmelman/AlamofireObjectMapper

Вы можете уменьшить все шаблонное и очень легко реализовать.

Сообщите мне, если у вас есть дополнительные вопросы.

3

Я действительно предлагаю вам использовать некоторый объект Mapper, поскольку он делает синтаксический анализ супер простым. Вы можете следовать следующим ссылкам:

JsonJoy очень проста в использовании

https://github.com/daltoniam/JSONJoy-Swift

Или вы можете проверить полную детализацию в ссылке ниже:

http://harlankellaway.com/blog/2015/07/05/swift-json-parsing-by-example

В противном случае вам может пойти с Adrian Bobrowski Ответ.

1

Я использую Alamofire так:

let Header   = [ "Authorization" : Token ] 
let Parameters  = [:] 
var json : JSON  = nil 
Alamofire.request(URLString, method: method, parameters: Parameters, headers : Header) 
    .responseJSON { response in 
     switch response.result { 
     case .success(let data): 
      json = JSON(data) 
      print(json) 
     case .failure(let error): 
      print("Request failed with error: \(error)") 
     } 
} 
} 

Так после этого вы можете разобрать ваш JSON, как это, например:

if json != nil { 
let name  = json["name"].stringValue 
let avatar  = json["avatar"].stringValue 
let lng  = json["lng"].doubleValue 
let lat  = json["lat"].doubleValue 
} 

Надежда Я помог тебе, мир