Help us understand the problem. What is going on with this article?

Xcode6.1で確認済み!SwiftyJSONで超簡単にSwiftでHotpapper APIのレスポンス(JSON)をパースする

More than 5 years have passed since last update.

SwiftのJSONをパースする定番はAFJSONResponseSerializer

実装方法はいくつかあると思いますが、
大体、以下のようなコードになります

let manager = AFHTTPRequestOperationManager()
manager.responseSerializer = AFHTTPResponseSerializer()
manager.GET("http://webservice.recruit.co.jp/relax/salon/v1?response_reserve=1&count=15&order=3&address=%E9%8A%80%E5%BA%A7&key=d80cc5011c92e61d&format=json", parameters: nil,
    success: { (operation: AFHTTPRequestOperation!, responseObject:AnyObject!) in
        println("response: \(responseObject)")
    }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in
        println("error: \(error)")
    })

ただHotpapper APIだとパースが上手くいきませんでした。
ホットペッパーのデータはこんな感じ

{
  "results":{
    "results_available":269,
    "api_version":"1.01",
    "salon":[
      {
        "last_update":"2014-07-25T08:17:37",
        "equipment":"12席",
        "mood":[
          {
            "caption":"写真はハンド&フットでオフ込9900円♪ウォーターバス無料☆",
            "photo":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/89/94/C002068994/C002068994_219-164.jpg"
          },
          {
            "caption":"大好評☆ウォーターバス&オフ無料☆オフ込6700円(税込)デザイン",
            "photo":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/79/91/C001977991/C001977991_219-164.jpg"
          },
          {
            "caption":"大好評デザイン☆『リゾートシェル』オフ込5200円(税込)",
            "photo":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/90/10/C002069010/C002069010_219-164.jpg"
          }
        ],
        "name_kana":"エービーシーネイル ギンザテン",
        "catch_copy":"【何度でもオフ無料】駅徒歩1分♪1カラーorラメグラ3980円☆表示価格すべて税込!平日昼割はオフ込4200円♪",
        "lng":"139.7677283349",
        "lat":"35.6730461059",
        "urls":{
          "qr":"http://webservice.recruit.co.jp/common/qr?url=http%3A%2F%2Fb.hpr.jp%2Fkr%2FH000253802%2F%3Fvos%3Dnhpkapis00001%26uid%3DNULLGWDOCOMO",
          "pc":"http://beauty.hotpepper.jp/kr/slnH000253802/?vos=nhpkapis00001",
          "mobile":"http://b.hpr.jp/kr/H000253802/?vos=nhpkapis00001&uid=NULLGWDOCOMO"
        },
        "address":"東京都中央区銀座2-7-7GINZA2ndAve.1-A 5F",
        "description":"いつでもオフ代無料♪表示価格はすべて税込♪1カラーorラメグラがオフ代込みでお値段変わらずいつでも3980円☆次回予約で2回目10%オフ!銀座線・丸ノ内線「銀座駅」徒歩2分、有楽町線「銀座一丁目駅」徒歩1分の好立地!夜22時迄営業で通いやすさ抜群☆経験豊富なネイリストが貴方の指先を大人ネイルに仕上げますっ♪",
        "feature":[
          {
            "code":"C023",
            "name":"ペディキュアコレクション",
            "caption":"デザイン多数♪全てオフ代込&税込!次回予約10%オフ♪駅徒歩1分で『3980円』から!当日予約もOK☆",
            "g_code":"SO01",
            "g_name":"注目特集",
            "photo":{
              "s":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/46/C002027146/C002027146_89-119.jpg",
              "l":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/46/C002027146/C002027146_262-349.jpg",
              "m":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/46/C002027146/C002027146_164-219.jpg"
            },
            "description":"大人気!!フットはウォーターバス無料でオフ込5700円~☆フット&ハンドで更に1000円引と断然お得!【写真はクーポン【8】オフ込6700円】次回予約で2回目10%オフ♪平日昼割オフ込4200円(ハンド)♪"
          },
          {
            "code":"L026",
            "name":"シンプル系(オフィス・日常)",
            "caption":"【いつでもオフ無料3980円(税込)~】全メニュー税込表示!当日予約OK♪次回予約で2回目さらに10%オフ☆",
            "g_code":"SP41",
            "g_name":"デザインやプランから探す",
            "photo":{
              "s":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/70/97/C002027097/C002027097_89-119.jpg",
              "l":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/70/97/C002027097/C002027097_262-349.jpg",
              "m":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/70/97/C002027097/C002027097_164-219.jpg"
            },
            "description":"新作☆夏ホロ♪『トロピカルドロップ』【写真はクーポン【4】利用でオフ込4200円】全メニューオフ無料♪当日予約もちろんOK!ABCは低価格・好立地・短時間!フット&ハンド同時ならお会計から更に1000円引き♪"
          },
          {
            "code":"L031",
            "name":"初めての方にオススメ",
            "caption":"【いつでもオフ無料3980円(税込)~】全て税込のお値段!駅徒歩1分~♪ワンカラーorラメグラがオフ込3980円",
            "g_code":"SP42",
            "g_name":"サロンの特徴から探す",
            "photo":{
              "s":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/70/98/C002027098/C002027098_89-119.jpg",
              "l":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/70/98/C002027098/C002027098_262-349.jpg",
              "m":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/70/98/C002027098/C002027098_164-219.jpg"
            },
            "description":"今月の新作♪シェルスワロ満載☆『大人サマージュエリー』【写真はクーポン【5】利用でオフ込4700円】次回予約で次回のお会計から10%オフと断然お得☆〔新規&全員〕ワンカラー・ラメグラ・ラメ1色オフ込3980円♪"
          },
          {
            "code":"L027",
            "name":"モテ可愛系(デート・合コン)",
            "caption":"【いつでもオフ無料3980円(税込)~】表示価格はすべて税込み♪次回予約で2回目10%オフ♪当日予約OK!",
            "g_code":"SP41",
            "g_name":"デザインやプランから探す",
            "photo":{
              "s":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/05/C002027105/C002027105_89-119.jpg",
              "l":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/05/C002027105/C002027105_262-349.jpg",
              "m":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/05/C002027105/C002027105_164-219.jpg"
            },
            "description":"新作☆お待たせしました!!人気の縦グラデ☆『ジュエリーミックス』【写真はクーポン【6】利用でオフ込5200円】全メニューオフ代込&税込♪毎月のキャンペーンネイルに4200円コース誕生★5200円・5700円コースもお得!"
          },
          {
            "code":"L077",
            "name":"定額プランのあるサロン",
            "caption":"【いつでもオフ無料3980円(税込)~】税込表示でわかりやすい!オフ無料で安心♪当日予約OK!駅徒歩1分~",
            "g_code":"SP41",
            "g_name":"デザインやプランから探す",
            "photo":{
              "s":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/08/C002027108/C002027108_89-119.jpg",
              "l":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/08/C002027108/C002027108_262-349.jpg",
              "m":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/08/C002027108/C002027108_164-219.jpg"
            },
            "description":"新作デザイン♪大人レディなシェルネイル『ジャスミンサマー』【写真はクーポン【7】利用でオフ込5700円】すべてオフ代込で安心定額制☆お友達との同時もOK☆フットも嬉しいウォーターバス無料でオフ代込5700円~♪"
          },
          {
            "code":"L075",
            "name":"長さ出しのできるサロン",
            "caption":"【いつでもオフ無料3980円(税込)~】表示価格は全て税込み♪駅徒歩1分~☆次回予約で2回目さらに10%オフ",
            "g_code":"SP41",
            "g_name":"デザインやプランから探す",
            "photo":{
              "s":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/18/C002027118/C002027118_89-119.jpg",
              "l":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/18/C002027118/C002027118_262-349.jpg",
              "m":"http://imgbp.hotp.jp/CSP/IMG_SRC_K/71/18/C002027118/C002027118_164-219.jpg"
            },
            "description":"新作★夏デザイン☆『アンダー・ザ・シー』【写真はクーポン【6】利用でオフ込5200円】22時迄営業で仕事後でも通える♪銀座駅2分・銀座一丁目駅1分と好立地♪フットも嬉しいウォーターバス無料+オフ代込で5700円~♪"
          }
      }
...
}

*見やすいように整形しています。APIを叩いて表示される内容とは異なりますので
ご了承ください。

SwiftyJSONのセットアップ

1・SwiftyJSON.swiftをダウンロード

以下のサイトからコードを取得します。
私はzipファイルをダウンロード後、解凍し、開いたxcode6 beta5を開き、
作成済みのプロジェクトにdrag & dropで投げ込みました。
コマンドベースでやりたい方は、作成済みのプロジェクトに移動して、
git cloneで取得する方法でも良いかと思います。

SwiftyJSON
https://github.com/lingoer/SwiftyJSON

SwiftyJSONを使ったソース

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.navigationItem.leftBarButtonItem = self.editButtonItem()

    let addButton = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "insertNewObject:")
    self.navigationItem.rightBarButtonItem = addButton

    // API先指定
    var url = "http://webservice.recruit.co.jp/relax/salon/v1?response_reserve=1&count=15&order=3&address=%E9%8A%80%E5%BA%A7&key=d80cc5011c92e61d&format=json"

    var reqest = NSURLRequest(URL: NSURL(string: url))
    NSURLConnection.sendAsynchronousRequest(reqest,queue:NSOperationQueue.mainQueue(),completionHandler:{
      (res: NSURLResponse!, data: NSData!, error: NSError!) in
      let json = JSONValue(data)

      if let url = json["results"]["salon"][0]["urls"]["pc"].string{
        println(url)
        self.url = url
      }

      if let image = json["results"]["salon"][0]["mood"][0]["photo"].string{
        println(image)
      }
      if let caption = json["results"]["salon"][0]["mood"][0]["caption"].string{
        println(caption)

      }
    })
  }

実行結果

1937488_581373631982301_5812887529809825008_n.jpg
コンソール画面に

  • クーポンURL
  • クーポンで使用している画像
  • クーポンで使用しているcaption

が表示されていることが確認できます!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした