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

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

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

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

Swift

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

Q&A

解決済

1回答

193閲覧

【Swift】自作APIからJSONを受け取ってUITableViewControllerに表示する方法

Soul3725

総合スコア21

JSON

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

Swift

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

0グッド

0クリップ

投稿2019/06/03 03:49

編集2019/06/04 15:36

自作APIから受け取ったJSONデータをUITableViewControllerに表示させたいです。
前提として、受け取るJSONデータは下記のもので、今後もデータが増えていくと仮定します。
この中からimgURLとnameを抽出してTableViewにサムネ画像の横に名前といった感じで表示させたいです。
Consoleに特定の値を表示させるところまでは成功したんですがtableViewのセルにJSONデータの量に応じて自動で値を入れて反映するまでの過程がわからないのでご教授いただければ幸いです。
補足:UITableViewControllerはデフォルトのままです。

JSON

1[ 2 { 3 imgURL : "(サムネ画像URL①)", 4 name : "User1", 5 comment : "私はUser1です。" 6 }, 7 { 8 imgURL : "(サムネ画像URL②)", 9 name : "User2", 10 comment : "僕はUser2です。" 11 }, 12 { 13 imgURL : "(サムネ画像URL③)", 14 name : "user3", 15 comment : "俺はUser3だ。" 16 } 17]

Swift

1import Foundation 2import UIKit 3 4struct List: Codable { 5 6 let imgURL : String 7 let name: String 8 let comment : String 9} 10 11class UserListViewController: UITableViewController { 12 13 override func viewDidLoad(){ 14 super.viewDidLoad() 15 getUserList() 16 } 17 18 func getUserList(){ 19 let list_url = URL (string : "(JSONのURL)")! 20 let list = URLRequest(url: list_url) 21 let task = URLSession.shared.dataTask(with: list) { (data, response, error) in 22 guard let data = data else{return} 23 do{ 24 let list = try JSONDecoder().decode([List].self , from: data) 25 print(list[0].name) //特定の値を取り出すテスト 26 } catch let e { 27 print(e) 28 } 29 } 30 task.resume() 31 } 32 33 34 35}

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

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

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

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

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

fuzzball

2019/06/04 08:35

質問にJSONは関係ないように見えますが‥。 TableViewの質問ですよね?
Soul3725

2019/06/04 15:34

JSONデータをtableViewに反映させる質問のつもりで投稿したので関係なくはないのかなと思いましたが・・・
fuzzball

2019/06/05 01:01

JSONの取得&デコードが出来ている(と自身も思っている)時点でJSONは関係ないです。 それはただの「構造体の配列」データで、その配列データをTableViewに表示出来ないというのは、純粋にTableViewの質問ということです。 問題の切り分け(細分化)というのは基本的なことであり有用でもあります。 切り分けの出来ていない質問は、私個人は「丸投げ」と判断することが多いです。
guest

回答1

0

ベストアンサー

UserListViewControllerクラスのメンバー変数に

var list: [List] = []

とでもして受け皿を作ってください。

let list = try JSONDecoder().decode([List].self , from: data)

でデコードが済んだら

self.list = list

でメンバに格納しつつ

tableView.reloadData()

のようなテーブルのリロード処理を入れてください。

あとは

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return list.count }

というように、変数の配列要素をもとに、UITableViewDelegateと対話してもらえれば良いです。

投稿2019/06/03 04:58

takabosoft

総合スコア8356

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

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

Soul3725

2019/06/04 08:20

リロード処理はviewDidLoad()内のgetUserList()の後に記述するので合ってますか? Delegateを使っての処理はまだ未経験なので自分でやってみてわからないようでしたら再度質問してみようと思います!
takabosoft

2019/06/05 02:13 編集

「getUserList()の後」がどこを指しているのかわかりませんが、JSONデコードしてlistをメンバに格納した直後です。たぶんメインスレッドで実行しないと駄目な気がするので、 DispatchQueue.main.async { self.list = list self.tableView.reloadData() } のような感じにすれば行けそうな気がします。
Soul3725

2019/06/07 08:15 編集

let list = try JSONDecoder().decode([List].self , from: data) DispatchQueue.main.async { self.list = list self.tableView.reloadData() } にしたらできましたありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問