質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

4218閲覧

iOSのSwiftでalamofireを使いjsonをパースする方法。

nakahon

総合スコア29

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2015/12/23 11:05

はじめましていまSwiftとAlamfireを使いjsonをパース使用としています。
戻り値をパースしようとしているのですが、やり方がわかりません。
どなたかわかる方に教えていただきたく思います。

【ソースコード】

import UIKit import Alamofire class ViewController: UIViewController { let requestUrl = ""; override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. Alamofire.request(.GET, requestUrl).responseJSON {response in let json = response.result.value; print(json); } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

こちら出力結果が下記になります。

Optional(( { id = 17; name = test; "num" = 982; } ))

この戻り値をdictonaryに変化して値を出力をしたいです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

はい。こんな感じでどうでしょう。

swift

1let jsonDict = response.result.value as! NSDictionary 2print(jsonDict) 3let id = jsonDict["id"] as! Int 4print(id) 5let name = jsonDict["name"] as! String 6print(name)

以下のように書くとどのような出力になりますか。

swift

1.responseJSON { response in 2 switch response.result { 3 // データを取り出す 4 case .Success(let value): 5 print(value) 6 // 失敗時エラー出力 7 case .Failure(let error): 8 print(error) 9 } 10}

また、requestUrlを変更しても出力に違いが見られませんか。
requestUrlhttps://tepco-usage-api.appspot.com/latest.jsonにすると、私の環境では以下のような出力になります。

json

1{ 2 capacity = 4214; 3 "capacity_peak_period" = 17; 4 "capacity_updated" = "2012-12-24 08:30:00"; 5 day = 25; 6 entryfor = "2015-12-24 16:00:00"; 7 forecast = 0; 8 "forecast_peak_period" = 17; 9 "forecast_peak_updated" = "2012-12-24 08:30:00"; 10 "forecast_peak_usage" = 3620; 11 hour = 1; 12 month = 12; 13 saving = 0; 14 usage = 2623; 15 "usage_updated" = "2015-12-24 17:05:06"; 16 year = 2015; 17}

ご参考にしてください。


これで動くでしょう。

以下のAPIで動作を確認しました。
https://tepco-usage-api.appspot.com/latest.json
https://qiita.com/api/v2/items

SwiftyJSONArgoのようなJSONパーサを利用したほうがきっと幸せになれるでしょう。
SwiftyJSON/SwiftyJSON
thoughtbot/Argo

swift

1.responseJSON { response in 2 switch response.result { 3 // データを取り出す 4 case .Success(let value): 5 // print(value) 6 let dataArray = NSMutableArray() 7 var dict = NSDictionary() 8 // レスポンスのデータ型を確認 9 if value is NSDictionary { 10 // print("value is Dictionary type.") 11 12 dict = value as! NSDictionary 13 dataArray.addObject(dict) 14 15 } else if value is NSArray { 16 // print("value is Array type.") 17 18 let count = value.count 19 for(var i = 0; i < count; ++i) { 20 dict = value[i] as! NSDictionary 21 dataArray.addObject(dict) 22 } 23 } 24 print("データ数: \(dataArray.count)") 25 print(dataArray[0]) 26 // print(dataArray[0]["id"] as! Int) 27 // 失敗時エラー出力 28 case .Failure(let error): 29 print(error) 30 } 31}

投稿2015/12/23 12:57

編集2015/12/24 20:36
izkn

総合スコア1698

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakahon

2015/12/24 11:34

ご回答ありがとうございます。 下記のエラーが出てしまいました、、、、。 fatal error: unexpectedly found nil while unwrapping an Optional value パースが成功していないのでしょうか?
nakahon

2015/12/26 04:43

ご回答ありがとうございました。 パースを失敗していた原因がapiサイドにも問題がありそもそもjsonでなくてテキストで出力していたのも原因でした。 無事に解決できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問