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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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回答

460閲覧

APIを叩いて取得したJsonをパースした後、変数に代入ができない

panyayan

総合スコア36

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クリップ

投稿2018/08/20 03:29

編集2018/08/20 04:16

引用テキスト現在Swift4でiOSアプリを作成しています。

APiを叩いてJsonを取得しパースした後のデータをテーブルに表示したいのですが
パースした後のデータを代入するための変数var stores : [categories.stores] を用意したのですが代入ができず値がnilになります。
調べてみたのですが、書き方自体は間違っていないように思います。

どうかご教授いただけると幸いです。

HomeViewController

1class HomeViewController: UIViewController,UITableViewDelegate, UITableViewDataSource { 2 3 @IBOutlet weak var TableView: UITableView! 4 5 6 var category_id = "" 7 let cellReuseIdentifier = "cell" 8 //Json用変数 9 var stores : [categories.stores]? 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 TableView.delegate = self 14 TableView.dataSource = self 15 16 let url = URL(string: "API") 17 let request = URLRequest(url: url!) 18 let session = URLSession.shared 19 20 let encoder: JSONEncoder = JSONEncoder() 21 encoder.dateEncodingStrategy = .iso8601 22 encoder.outputFormatting = .prettyPrinted 23 24 session.dataTask(with: request){(data, response, error)in if error == nil, 25 let data = data, 26 let response = response as? HTTPURLResponse{ 27 28 let decoder: JSONDecoder = JSONDecoder() 29 decoder.dateDecodingStrategy = .iso8601 30 do { 31 32 let json = try decoder.decode(categories.self, from: data) 33 34 //Jsonを変数に代入 35 self.stores = json.stores 36 37 } catch { 38 print("error:", error.localizedDescription) 39 40 } 41 42 } 43 44 }.resume() 45 } 46 47 override func viewDidAppear(_ animated: Bool) { 48 super.viewDidAppear(animated) 49 50 51 } 52 53 override func didReceiveMemoryWarning() { 54 super.didReceiveMemoryWarning() 55 56 } 57 58 59 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 60 return (stores!.count) 61 } 62 63 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 64 guard let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as? TableViewCell 65 else { 66 fatalError("The dequeued cell is not an instance of TableViewCell.") 67 } 68 69 //cell.imageCell.image = UIImage(named: "") 70 71 if let name:String = stores![indexPath.row].name{ 72 cell.storeName.text! = name 73 }else{ 74 cell.storeName!.text = "nil" 75 } 76 if let location : String = stores![indexPath.row].location{ 77 cell.storeLocation.text! = location 78 }else{ 79 cell.storeLocation.text! = "nil" 80 } 81 82 return cell 83 } 84 85 86 87 88} 89

JsonModel

1struct categories : Codable { 2 let id : Int 3 let name : String 4 let stores : [stores] 5 6 struct stores : Codable { 7 let id : Int 8 let name : String 9 let location : String 10 let price : String 11 let open_time : String 12 let closed_day : String 13 let photos : [photos] 14 let tags : [tags] 15 16 struct photos:Codable { 17 let id : Int 18 let path : String 19 } 20 21 struct tags:Codable { 22 let id : Int 23 let name : String 24 } 25 } 26} 27

OutPutJson

1categories 2( 3id: 1, 4name: "誕生日", 5 stores: [Sweemy.categories.stores 6( 7id: 1, 8name: "Pink Cafe Tokyo", 9 location: "東京", 10 price: "1000~3000", 11 open_time: "10:00-14:00", 12 closed_day: "月曜日", 13 photos: [Sweemy.categories.stores.photos 14( 15id: 1, 16path: "photos/Pink Cafe Tokyo_0.jpeg" 17) 18], 19tags: [Sweemy.categories.stores.tags 20( 21id: 1, name: "スイーツ" 22), 23Sweemy.categories.stores.tags 24( 25id: 13, 26name: "ピンクカフェ" 27), 28 Sweemy.categories.stores.tags( 29id: 14, 30name: "コンセプトカフェ" 31) 32] 33)

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

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

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

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

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

fuzzball

2018/08/20 04:01 編集

代入以前に、jsonの値がnilになっているのでは?
panyayan

2018/08/20 04:04

print (json)でlet json = try decoder.decode(categories.self, from: data)の値を出力できているので取得できていると思います
fuzzball

2018/08/20 04:09 編集

storesがnilであることをどうやって確認しましたか?
panyayan

2018/08/20 04:16

画面下のDebugの画面に出力されました
fuzzball

2018/08/20 04:19

どの時点で?
panyayan

2018/08/20 05:02

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return (stores!.count) }の時点です
fuzzball

2018/08/20 05:08

落ちるということでしょうか?
panyayan

2018/08/20 05:11

はい、Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueとエラーが出力されます
guest

回答1

0

ベストアンサー

JSONの読み込み完了前にtableView(_:numberOfRowsInSection:)が実行されたとき、まだstoresがnilなのに強制アンラップしているのが原因です。

読み込み完了まで(storesがnilのとき)は0を返すようにします。

swift

1func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 2 return stores?.count ?? 0 3}

投稿2018/08/20 05:12

fuzzball

総合スコア16731

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

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

panyayan

2018/08/20 05:27

ありがとうございます。無事表示されました!!:)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問