LoginSignup
35
35

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-10-31

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
35