Alamofire で http リクエストを行うサンプルはよく見かけるのですが戻ってきたレスポンスをどう扱えばいいかわからなかったのでメモ。
前提
- JSON(Array) を返す API がある
- 結果を配列に取り込みたい
やること
- 配列の要素となるクラスを定義する
- JSON Array の値を配列の要素となるクラスに代入
レスポンス
このような JSON を返す API があるとします
[
{
id: 1,
name: "BDZ-ET2100",
image_url: "http://sample.me/a.jpg",
document_url: "http://sample.me/a.pdf",
created_at: "2014-10-21T17:18:52.360+09:00",
updated_at: "2014-10-21T17:18:52.360+09:00"
},
{
id: 2,
name: "BDZ-EX3000",
image_url: "http://sample.me/b.jpg",
document_url: "http://sample.me/b.pdf",
created_at: "2014-10-21T17:18:52.376+09:00",
updated_at: "2014-10-21T17:18:52.376+09:00"
}
..
]
配列の要素となるクラスを定義する
Product.swift
import Foundation
class Product: NSObject {
var name: String, documentUrl: String, imageUrl: String
init(name: String, documentUrl: String, imageUrl: String) {
self.name = name
self.documentUrl = documentUrl
self.imageUrl = imageUrl
}
}
JSON Array の値を配列の要素となるクラスに代入
responseJSON メソッドを使って、JSON 引数に対してキャストを行います。その後は必要なキーにアクセスして値を取り出します。
今回は JSONArray が返ってきたので Array < Dictionary < String,AnyObject > > でキャストしましたが、 JSON が返る場合は Dictionary < String,AnyObject > でキャストすればいけると思います。
ViewController.swift
import UIKit
import Alamofire
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
...
var products = [Product]()
func request(){
Alamofire.request(.GET, "http://sample.me/api/v1/product", parameters: nil)
.responseJSON {(_, _, JSON, error) in
if let productParamArray = JSON as? Array<Dictionary<String,AnyObject>> {
for productParam in productParamArray {
let product = Product(name: productParam["name"] as String,
documentUrl: productParam["document_url"] as String,
imageUrl: productParam["image_url"] as String)
self.products.append(product)
println("JSON: name: \(product.name)")
println("JSON: documentUrl: \(product.documentUrl)")
println("JSON: imageUrl: \(product.imageUrl)")
}
self.tableview.reloadData()
}
}
}
...
}