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

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

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

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

831閲覧

Swift Alamofireを用いてAPIを叩く

_sora_

総合スコア14

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2019/10/30 02:17

編集2019/10/31 00:13

前提・実現したいこと

Alamofireを利用してRailsからのAPIを叩くということをやっています。
下記の記事を参考に進めています。
https://qiita.com/yutat93/items/1b6dfe34fa8537cf3329

http://localhost:3000/api/productsは
イメージ説明
イメージ説明
のような感じです。

このデータを取り出してSwiftで表示させたいのですが、うまく値を取り出すことができません。
どこが間違っているのがご教授をお願いします。

発生している問題・エラーメッセージ

イメージ説明

該当のソースコード

Swift

1 override func viewDidLoad() { 2 super.viewDidLoad() 3 getArticles() 4 } 5 6 func getArticles() { 7 Alamofire.request("http://localhost:3000/api/products", method: .get) // APIへリクエストを送信 8 .responseJSON { (response) in 9 guard let object = response.result.value else { 10 return 11 } 12 13 let json = JSON(object) 14 json.forEach { (_, json) in 15 print(json["title"].string!) 16 } 17 } 18 }

試したこと

let json = JSON(object) print(json)

では
イメージ説明
見たところいい感じに表示されています。
これをtitleやdetailだけを表示させたいです。

let json = JSON(object) json.forEach { (_, json) in print(json["title"].string) }

json["title"].stringとすると、
イメージ説明
nilと表示されてしまいます。

補足情報(FW/ツールのバージョンなど)

Swift 5.1
Xcode 11.1

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

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

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

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

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

TakuyaAso

2019/10/30 06:48

データを受けるモデル作った方がいいと思います。 あとは自然に解決しそうです。
takabosoft

2019/10/30 07:01

ぱっと見問題なさそうに見えますね。 json.forEach { (_, json) in print(json) } だと何が出るんでしょう?
_sora_

2019/10/30 07:17

[ { "detail" : "海を舞台に繰り広げられるサバイバルを描く「オープン・ウォーター」シリーズ第3作。オーストラリア沖でサメだらけの海に投げ出された観光客たちの運命を、事件から1週間後に海底で発見された水中カメラの映像で描いたファウンドフッテージ形式のサバイバルスリラー。2015年10月21日。アメリカ人のジョシュ、メーガン、ジェフはエクストリームゲーム番組のオーディションテープを撮影するため、オーストラリアのアデレード沖で「シャーク・ケージ・ダイビング」のツアーに参加していた。ところが彼らを乗せたクルーザーが高波にのまれて転覆し、参加者たちは海に投げ出されてしまう。ジョシュは周囲の人々が相次いでサメの餌食になっていく様子を小型水中カメラで撮影する。ジョシュたちは夜になって救命イカダを発見し、命の危機を脱したかに思えたが……。新宿シネマカリテの特集企画「カリコレ2017/カリテ・ファンタスティック!シネマコレクション2017」(17年7月15日~8月18日)上映作品。", "open_date" : "2017年8月13日", "created_at" : "2019-04-02T03:21:58.000Z", "updated_at" : "2019-04-02T03:21:58.000Z", "image_url" : "http:\/\/eiga.k-img.com\/images\/movie\/87277\/photo\/41d5d29a7ea46b41\/320.jpg?1499062696", "title" : "ケージ・ダイブ", "director" : "ジェラルド・ラシオナト", "id" : 1 },
_sora_

2019/10/30 07:19

上から3番目の写真と変わらない感じです。
takabosoft

2019/10/30 07:26

中に入れてないですね・・・。 json.forEach { (_, test) in print(test) } みたいに名前変えても一緒ですよね?
_sora_

2019/10/30 08:02

はい、一緒でした。
takabosoft

2019/10/30 08:30

ですよね、情報ありがとうございます。他の方に期待。
takabosoft

2019/10/30 08:49 編集

ちなみにhttp://localhost:3000/api/productsの結果のスクショを見ると"status"や"message"と言ったキーが見受けられますが、この辺の値ってJSONデータとしては見えないのでしょうか?いきなり"Data"キーの方がパースされているように見えますが、フレームワーク的にそういうものなのでしょうか? なんとなく let json = JSON(object) json["data"].forEach { (_, json) in print(json["title"].string) } みたいに、dataキーの中を回さないといけないような気がするのですが。
_sora_

2019/10/30 12:00

"status"や"message"のキーはスクショ外でちゃんと見えています。 json["data"].forEachを使ってタイトルのみ取り出すことができました! takabosoftさん、ありがとうございます!
takabosoft

2019/10/31 00:06

お、良かったです。 出力結果を、_sora_さんがご自分の判断で切り取ってしまった事、 そしてそれを最初から私も指摘しなかった事が反省点ですね。
_sora_

2019/10/31 00:16

自分が悪かったわけであって反省点だなんてそんなことないです。 本当にありがとうございました。 もっと精進します!
guest

回答1

0

ベストアンサー

swift

1let json = JSON(object) 2json["data"].forEach { (_, json) in 3 print(json["title"].string) 4}

のように、dataキーの中を回してください。

投稿2019/10/31 00:04

takabosoft

総合スコア8356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問