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

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

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

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

Swift

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

Q&A

解決済

1回答

1692閲覧

SwiftyJSONを使ってJSONを読み込む(swift4)

denshatrain

総合スコア16

JSON

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

Swift

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

0グッド

0クリップ

投稿2018/09/19 21:17

編集2018/09/23 01:22

前提・実現したいこと

swiftyJSONを使って下のようなJSONを読み込みたいのですが画面に何も出て来ません。

json

1{ 2 "kind": "youtube#searchListResponse", 3 "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/sK9J7bsFpx18009cMMg0Lm6BSUg\"", 4 "nextPageToken": "CAoQAA", 5 "regionCode": "JP", 6 "pageInfo": { 7 "totalResults": 7161, 8 "resultsPerPage": 10 9 }, 10 "items": [ 11 { 12 "kind": "youtube#searchResult", 13 "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/n8MR9oEibzEjQGRvkJ2YD_uMgIo\"", 14 "id": { 15 "kind": "youtube#video", 16 "videoId": "pCQ8LDrTXbE" 17 }, 18 "snippet": { 19 "publishedAt": "2016-08-12T09:30:01.000Z", 20 "channelId": "UCEzPCE4ULESqrp2m013wrlA", 21 "title": "【Minecraft】うるさいけどロマンなエスカレーター【へぼてっく】", 22 "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...", 23 "thumbnails": { 24 "default": { 25 "url": "https://i.ytimg.com/vi/pCQ8LDrTXbE/default.jpg", 26 "width": 120, 27 "height": 90 28 }, 29 "medium": { 30 "url": "https://i.ytimg.com/vi/pCQ8LDrTXbE/mqdefault.jpg", 31 "width": 320, 32 "height": 180 33 }, 34 "high": { 35 "url": "https://i.ytimg.com/vi/pCQ8LDrTXbE/hqdefault.jpg", 36 "width": 480, 37 "height": 360 38 } 39 }, 40 "channelTitle": "へぼてっくちゃんねる", 41 "liveBroadcastContent": "none" 42 } 43 }, 44 { 45 "kind": "youtube#searchResult", 46 "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/Q_XYdMQnRI09uy066b4JDGYJHX4\"", 47 "id": { 48 "kind": "youtube#video", 49 "videoId": "3gaRTWP8jwI" 50 }, 51 "snippet": { 52 "publishedAt": "2015-02-06T09:00:16.000Z", 53 "channelId": "UCEzPCE4ULESqrp2m013wrlA", 54 "title": "【Minecraft】完全水抜き海底神殿で迷うw【へぼてっく】", 55 "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...", 56 "thumbnails": { 57 "default": { 58 "url": "https://i.ytimg.com/vi/3gaRTWP8jwI/default.jpg", 59 "width": 120, 60 "height": 90 61 }, 62 "medium": { 63 "url": "https://i.ytimg.com/vi/3gaRTWP8jwI/mqdefault.jpg", 64 "width": 320, 65 "height": 180 66 }, 67 "high": { 68 "url": "https://i.ytimg.com/vi/3gaRTWP8jwI/hqdefault.jpg", 69 "width": 480, 70 "height": 360 71 } 72 }, 73 "channelTitle": "へぼてっくちゃんねる", 74 "liveBroadcastContent": "none" 75 } 76 }, 77 { 78 "kind": "youtube#searchResult", 79 "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/J3jkHc1QCoTbjo5VVrt58e7rIy0\"", 80 "id": { 81 "kind": "youtube#video", 82 "videoId": "lYU4Hmnov00" 83 }, 84 "snippet": { 85 "publishedAt": "2016-05-20T09:30:00.000Z", 86 "channelId": "UCEzPCE4ULESqrp2m013wrlA", 87 "title": "【Minecraft】Gホイホイ的なエンダーマントラップタワー【へぼてっく】", 88 "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...", 89 "thumbnails": { 90 "default": { 91 "url": "https://i.ytimg.com/vi/lYU4Hmnov00/default.jpg", 92 "width": 120, 93 "height": 90 94 }, 95 "medium": { 96 "url": "https://i.ytimg.com/vi/lYU4Hmnov00/mqdefault.jpg", 97 "width": 320, 98 "height": 180 99 }, 100 "high": { 101 "url": "https://i.ytimg.com/vi/lYU4Hmnov00/hqdefault.jpg", 102 "width": 480, 103 "height": 360 104 } 105 }, 106 "channelTitle": "へぼてっくちゃんねる", 107 "liveBroadcastContent": "none" 108 } 109 } 110 ] 111}

該当のソースコード

swift

1import UIKit 2import Accounts 3import SwiftyJSON 4import Alamofire 5 6class ViewController: UIViewController, UITableViewDataSource { 7 8 var articles: [[String: String?]] = [] 9 let table = UITableView() 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 title = "記事一覧" 14 15 table.frame = view.frame 16 view.addSubview(table) 17 table.dataSource = self 18 19 getArticles() 20 } 21 22 func getArticles() { 23 let a = "https:/" 24 let b = "/qiita.com/api/v2/items" 25 let c = a + b 26 let appid = "AIzaSyCAIznRo4MUdgBtijMnd2De9YEUqMdmwaY" 27 let entryUrl: String = "https://www.googleapis.com/youtube/v3/search?key=AIzaSyCAIznRo4MUdgBtijMnd2De9YEUqMdmwaY&q=" 28 29 Alamofire.request(entryUrl + "へぼてっく" + "&part=snippet&maxResults=10&order=viewCount") 30 .responseJSON { response in 31 guard let object = response.result.value else { 32 return 33 } 34 35 let json = JSON(object) 36 json.forEach { (_, json) in 37 let article: [String: String?] = [ 38 39 "title": json["items"]["snippet"]["title"].string, 40 "userId": json["items"]["id"]["videoId"].string, 41 42 ] 43 self.articles.append(article) 44 } 45 self.table.reloadData() 46 } 47 } 48 49 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 50 return articles.count 51 } 52 53 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 54 let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell") 55 let article = articles[indexPath.row] 56 cell.textLabel?.text = article["title"]! 57 cell.detailTextLabel?.text = article["userId"]! 58 return cell 59 } 60}

###実行時の画面

実行時の画面

###urlエンコードしたコード

swift

1import UIKit 2import Accounts 3import SwiftyJSON 4import Alamofire 5 6class ViewController: UIViewController, UITableViewDataSource { 7 8 var articles: [[String: String?]] = [] 9 let table = UITableView() 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 title = "記事一覧" 14 15 table.frame = view.frame 16 view.addSubview(table) 17 table.dataSource = self 18 19 getArticles() 20 } 21 22 func getArticles() { 23 let appid = "AIzaSyCAIznRo4MUdgBtijMnd2De9YEUqMdmwaY" 24 let entryUrl: String = "https://www.googleapis.com/youtube/v3/search?key=AIzaSyCAIznRo4MUdgBtijMnd2De9YEUqMdmwaY&q=" 25 26 let inputText = entryUrl + "へぼてっく" + "&part=snippet&maxResults=10&order=viewCount" 27 28 guard let escapedInputText = inputText.addingPercentEncoding( 29 withAllowedCharacters: CharacterSet.urlQueryAllowed 30 ) else { 31 return 32 } 33 34 Alamofire.request(escapedInputText) 35 .responseJSON { response in 36 guard let object = response.result.value else { 37 return 38 } 39 40 let json = JSON(object) 41 print(json) 42 json.forEach { (_, json) in 43 let article: [String: String?] = [ 44 "title": json["items"]["snippet"]["title"].string, 45 "userId": json["items"]["id"]["videoId"].string, 46 47 ] 48 self.articles.append(article) 49 } 50 self.table.reloadData() 51 } 52 } 53 54 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 55 return articles.count 56 } 57 58 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 59 let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell") 60 let article = articles[indexPath.row] 61 cell.textLabel?.text = article["title"]! 62 cell.detailTextLabel?.text = article["userId"]! 63 return cell 64 } 65}

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

swift4.1
ios11.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらくURLの生成に失敗しています。
日本語などのマルチバイト文字はURLエンコードしてください。


追記:

json["items"]は配列なので

swift

1json["items"].array?.forEach { item in 2 3 let article: [String: String?] = [ 4 "title": item["snippet"]["title"].string, 5 "userId": item["id"]["videoId"].string, 6 ] 7 self.articles.append(article) 8}

こうじゃないですかね。

投稿2018/09/21 08:45

編集2018/09/23 02:39
MasakiHori

総合スコア3384

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

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

denshatrain

2018/09/21 21:36

urlをエンコードしましたが改善されません。 print分でjsonを出力させて見ると情報を読み取れるようになったらしいのですが、実行画面はそのままです。 どうしたら良いでしょうか?
MasakiHori

2018/09/22 13:39

そのコードを提示してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問