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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

iOS

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

Swift

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

API

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

Q&A

解決済

1回答

1128閲覧

【Swift】条件指定してのJSONデータ取得方法

duck015

総合スコア29

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

iOS

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

Swift

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

API

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

0グッド

0クリップ

投稿2020/01/24 02:44

編集2020/01/24 03:13

前提・実現したいこと

下記のようなJsonデータがあります。
今回はid,title,moviename3つのデータを取得し、articlesに格納したいです。

ただ"type": "movie"の時のみmovienameが入っているデータになるため、下記の通りコードを書きましたが、
"type": "picture"の時はmovienameのデータがないため、nilとなりエラーになってしまいます。

この場合はtypeをキーとして条件分岐させて取得するようなイメージになると思いますが、
具体的にどのようなコードを書けばいいのか分からず苦慮しております。
どなたかご教示いただけませんでしょうか?

該当のソースコード

JSON

1{ 2 "result": true, 3 "data": [ 4 { 5 "type": "movie", 6 "article": { 7 "id": "123", 8 "title": "タイトル1", 9     "moviename": "hogehoge" 10 } 11 }, 12 { 13    "type": "picture", 14 "article": { 15 "id": "456", 16 "title": "タイトル2" 17 } 18 } 19 ] 20}

ArticleListViewController

1  var articles: [Article] = [] { 2 didSet { 3 articleTableView.reloadData() 4 } 5 } 6 7 func getArticles() { 8 Alamofire.request("url").validate().responseJSON { response in 9 guard let object = response.result.value else { 10 return 11 } 12 let json = JSON(object) 13 json["data"].forEach { (_, json) in 14 let article: [String: Any?] = [ 15 "title": json["article"]["title"].string!, 16 "id": json["article"]["id"].string! 17 "moviename": json["article"]["moviename"].string! 18 ] 19 self.articles.append(Article(json: article)) 20 } 21 print(self.articles) 22 } 23 }

Article

1struct Article { 2 let title: String 3 let id: String 4 let moviename: String 5 6 init(json: [String: Any]) { 7 title = json["title"] as? String ?? "" 8 id = json["id"] as? String ?? "" 9 moviename = json["moviename"] as? String ?? "" 10 } 11 init() { 12 title = "" 13 id = "" 14 moviename = "" 15 } 16}

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

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

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

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

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

thyda.eiqau

2020/01/24 02:54

"moviename": json["article"]["movieame"].string! そもそもこの時点でtypoがある (movieame -> moviename) と思うのですが、本当にtypeがpictureのときしかエラーにならないのですか?
duck015

2020/01/24 03:02

大変失礼いたしました。修正しました。。 また、再度確認しましたが、やはりエラーとなってしまいます。
thyda.eiqau

2020/01/24 03:10

小出しにすみませんが、json["icon"]というのはどこから出てきたのでしょうか。
duck015

2020/01/24 03:15

すみません、"id"の間違いです。。。 尚、コードは元から"id"となっています。 質問用に少し修正して掲載したため、差異が生じてしまいました。
guest

回答1

0

ベストアンサー

Article のイニシャライザでnilチェックをしているようですので、json["article"]をそのまま init(json:) に渡せばいいのではないでしょうか。

swift

1Alamofire.request("url").validate().responseJSON { response in 2 guard let object = response.result.value as? Dictionary<String, AnyObject> else { 3 return 4 } 5 self.articles += (object["data"] as? [[String: Any]]).map { Article(json: $0["article"]) } 6}

投稿2020/01/24 03:37

編集2020/01/24 05:49
thyda.eiqau

総合スコア2982

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

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

duck015

2020/01/24 04:56

ご回答ありがとうございます! たしかに各要素毎に取るより、そのまま渡すのがいいですね。 実際にコードを修正してみたところ、$0["article"]の部分で、下記エラーが発生しました。 色々と調べてみましたが原因が分からず...宣言部がおかしいのでしょうか...? Cannot subscript a value of type 'String' with an argument of type 'String'
thyda.eiqau

2020/01/24 05:46

おっと、失礼、ぼけてましたね。修正します。
duck015

2020/01/24 06:39

ありがとうございます! 無事取得することができました! 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問