JSON
Swift
Alamofire
SwiftyJSON

Swift3 + Alamofire4 + SwiftyJSONでJSONレスポンスをパースするサンプル

More than 1 year has passed since last update.

背景

最近自作アプリをSwift3.0対応したときに、Alamofireも4にアップデートされ、JSONレスポンスをパースするのに少し困ったのでメモとして残します。原始的な方法とSwiftyJSONの2つでパースしています。

Alamofire4の使い方(あまりきれいじゃない原始的な感じ)

あるAPIに、パラメータをdate=20161013でGETリクエストを投げて、下記の様なJSONレスポンスが返ってくるとします。

{
    "info": [
        {
            "type": "foo",
            "url": "url~~"
        },
        {
            "type": "bar",
            "url": "url~~"
        }
    ]
}

AlamofireでのGETリクエストはこんな感じ。デフォルトだとGETになるみたいです。POSTとか他の詳しいこと知りたい人は公式Github読んでください。

Alamofire.request("https://~~~", parameters: ["date": "20161013"]).responseJSON{ response in
    if let dict = response.result.value as? Dictionary<String, AnyObject> {
        if let datas = dict["info"] as? [[String:Any]] {
            for data in datas {
                if let type = data["type"] as? String {
                    print(type) // foo or bar
                }
            }
        }       
    }
}

型がAnyになっちゃうので全部オプショナルにしてアンラップしていくとこんな気持ち悪いif文の連鎖になっちゃいました。もっとスマートなやり方あると思うんですけどね〜とりあえずこれで取り出せたのでOKかな。今回の場合は、自作APIだったので、infoがなければエラーとして扱う仕様にしていたので1つ目のアンラップ時にelseでエラー処理とか実際にはしてます。

Alamofire4の使い方 with SwiftyJSON

Alamofire.request("https://~~~", parameters: ["date": "20161013"]).responseJSON{ response in
    let json = JSON(response.result.value)
    json["info"].forEach{(_, data) in
        let type = data["type"].string!
        print(type) // foo or bar
    }
}

SwiftyJSONを使うと圧倒的にきれいにかけますね〜。

おわり