2017-02-16 3 views
1

Alamofire内のAPIからすべてのデータを解析する方法が不思議でした。Alamofire 4.0とSwfit 3で辞書の配列を解析する

APIからデータの辞書を1つだけダウンロードするコードです。どうすれば他のものをダウンロードできますか?

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() 
} 

そして今、あなたのオブジェクトのコレクションを持っている:ここでは

はJSONFormatterからのスクリーンショットです。そしてそれであなたが望むことをすることができます

+0

もI Structを返すことはできません。これは、私のコードの4行目のバグを示しています: "現在のコンテキストでクロージャータイプを推論することができません" – Magnifique

+0

@トナミニ私の訂正された答えを見てください –

+0

うーん...それはほぼ完璧ですが、それは全体の配列コレクションデータを印刷しているときは、10回。辞書の一束を表示します。それを修正する方法はありません:O – Magnifique

1

私は、カスタムオブジェクトへのマッピングを実装することをお勧めします。これはあなたを助けるライブラリであり、Alamofireと統合することができます。

https://github.com/tristanhimmelman/AlamofireObjectMapper

すべての定型を削減し、実装するのは本当に簡単ですすることができます。

質問がありましたら教えてください。

3

私は本当にあなたが超簡単に解析できるようにいくつかのオブジェクトマッパーを使用することをお勧めします。

JsonJoyが

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

を使用することは非常に簡単であるか、あなたは下のリンクで完全な詳細を確認することができます:あなたは、リンクの下にたどることができ

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

あなたをそうでない場合回答はAdrian Bobrowskiとすることができます。

1

私はこのようなAlamofireを使用しています:あなたは、たとえば、このようなあなたのJSONを解析することができる後にそう

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)") 
     } 
} 
} 

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

私はあなたを助けた希望、平和

関連する問題