iOS
Swift

Alamofire で JSON を返す API を呼び出す

More than 3 years have passed since last update.

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