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

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++と共存することが意図されています

Q&A

解決済

1回答

1625閲覧

【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++と共存することが意図されています

0グッド

0クリップ

投稿2020/01/28 08:24

編集2020/01/28 08:30

前提・実現したいこと

teratailのAPIを叩いて、質問一覧を取得したいです。
ライブラリはAlamofire, swiftyJSONを使用しています。

下記の通りコードを書きましたが、display_nametagsのみデータ取得できないです。
画像の通り、"",[]となってしまいます。
下記の通りprintすると問題なく、出力されますため、恐らくQuestionファイルに問題があると思っているのですが、何が原因なのか分からず苦慮しています。
どなたか原因ご教示いただけないでしょうか?

print(json[Const.user][Const.displayName]) print(json[Const.tags])

イメージ説明

JSON構造

JSON

1{ 2 meta:{ 3 message: "success", 4 total_page: 11734, 5 page: 1, 6 limit: 20, 7 hit_num: 234677 8}, 9questions:[ 10 { 11 id: 237853, 12 title: "ELB+EC2+nginx+express環境でhttps対応をしたがバックエンドが動かない", 13 created: "2020-01-27 19:45:04", 14 modified: "2020-01-27 19:45:04", 15 count_reply: 0, 16 count_clip: 0, 17 count_pv: 4, 18 is_beginner: false, 19 is_accepted: false, 20 is_presentation: false, 21 tags:["nginx", "Amazon EC2", "AWS(Amazon Web Services)", "HTTPS", "Express"], 22 user:{ 23 display_name: "aqaqsanba", 24 photo: "https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/138880/gI0ELDZK_thumbnail.jpg", 25 score: 0 26 } 27},

該当のソースコード

Const

1struct Const { 2 static let id = "id" 3 static let title = "title" 4 static let tags = "tags" 5 static let user = "user" 6 static let displayName = "display_name" 7 static let photo = "photo" 8}

Question

1struct Question { 2 let id: Int 3 let title: String 4 let tags: [String] 5 let displayName: String 6 let photo: String 7 8 init(json: [String: Any]) { 9 id = json[Const.id] as? Int ?? 0 10 title = json[Const.title] as? String ?? "" 11 tags = json[Const.tags] as? [String] ?? [] 12 displayName = json[Const.displayName] as? String ?? "" 13 photo = json[Const.photo] as? String ?? "" 14 } 15}

QuestionListViewController

1var questions: [Question] = [] { 2 didSet { 3 questionListTableView.reloadData() 4 } 5} 6 7func getQuestions() { 8 Alamofire.request("https://teratail.com/api/v1/questions").responseJSON { response in 9 guard let object = response.result.value else { 10 return 11 } 12 let json = JSON(object) 13 json["questions"].forEach { (_, json) in 14 let question: [String: Any] = 15 ["id": json[Const.id].intValue, 16 "title": json[Const.title].stringValue, 17 "tags": json[Const.tags].arrayValue, 18 "displayName": json[Const.displayName][Const.displayName].stringValue, 19 "photo": json[Const.user][Const.photo].stringValue 20 ] 21 self.questions.append(Question(json: question)) 22 } 23 print(self.questions) 24 } 25 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

JSONからJSONを生成してQuestionを初期化するのをやめて、
JSONからQuestionを直接初期化してみてはどうでしょうか?

その辺りの変換ミスと記述ミスが原因かと思います。

json[Const.displayName][Const.displayName].stringValue

[Const.displayName]一個多いですよね。

投稿2020/01/28 09:01

takabosoft

総合スコア8356

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

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

duck015

2020/01/28 09:48

回答ありがとうございます!タイポ見落としてました。。。 ただ、その箇所を修正しても取得ができませんでした。 他に何が原因であると考えられるでしょうか?(原因を知りたく...) まずは、takabosoftさんの方法で再度やってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問