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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

2回答

2673閲覧

iOSでWeb APIを叩いてJSONをパース...できません

bruteberry

総合スコア20

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2017/01/11 10:46

編集2017/01/13 05:30

###前提・実現したいこと
iOSでAPIを利用したい。
前にも似たような質問をしているのでお恥ずかしい限りですが、いまいち通信をする部分の作り方がよく分かっていません。
事情があってAPIのURLは晒せないのですが、下の方のprint(jsonData)はきちんと実行され、

[{"prefix_1":"bene","prefix_1_mean":"善い","prefix_1_image":"http://www.**.png","prefix_2":"","prefix_2_mean":null,"prefix_2_image":"","radix_1":"dict","radix_1_mean":"言う","radix_1_image":"http://www..png","radix_2":"","radix_2_mean":null,"radix_2_image":"0","suffix_1":"tion","suffix_1_mean":"名詞化","suffix_1_image":"http://www..png","suffix_2":"","suffix_2_mean":null,"suffix_2_image":"","meaning":"祝福、祝祷、感謝の祈り","story_1":null,"story_2":null,"story_3":null,"story_4":null,"story_5":null,"example":"","ja_example":""}]

という結果が返ってきています。

同じ名前のString変数prefix_1にbeneを格納し、prefix_1_meanに善いを格納し...という感じにしたいのですが、うまくできません。

print(jsonData)は実行されているのにprint("ここからprefix1の中身")が実行されてないっぽいのもよく分かりません。

デバッグできない状態での質問で申し訳ないですが、アドバイスを頂けるとうれしいです。
よろしくお願いします。

###該当のソースコード

import UIKit class DetailViewController: UIViewController { @IBOutlet weak var detailWordLabel: UILabel! @IBOutlet weak var detailWordImage: UIImageView! //単語と関連画像 var word: String = String() var wordImage: String = String() //接辞・語根 var prefix1: String = String() //単語の意味 var mean: String = String() override func viewDidLoad() { super.viewDidLoad() //ラベルに単語名を設定 detailWordLabel.text = word //UIImageViewにユーザが選択した関連画像を設定 if let url = URL(string:wordImage) { let req = URLRequest(url: url) let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in if let data = data { if let anImage = UIImage(data: data) { DispatchQueue.main.async { self.detailWordImage.image = anImage } } } }) task.resume() } //とりあえずWORDはBenedictionということにする word = "benediction" //APIに接続 ////接続先URLの作成 let parameter = "WORD=\(word)" let url = "***********" let requestUrl = "\(url)?\(parameter)" //APIをリクエストする request(requestUrl: requestUrl) // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // リクエストを行なう func request(requestUrl: String) { // URL生成 guard let url = URL(string: requestUrl) else { // URL生成失敗 return } // リクエスト生成 let request = URLRequest(url: url) // APIをコールして商品検索を行なう let session = URLSession.shared let task = session.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in // 通信完了後の処理 print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) ?? "") // エラーチェック guard error == nil else { // エラー表示 let alert = UIAlertController(title: "エラー", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert) // UIに関する処理はメインスレッド上で行なう DispatchQueue.main.async { self.present(alert, animated: true, completion: nil) } return } // JSONで返却されたデータをパースして格納する guard let data = data else { // データなし return } // JSON形式への変換処理 guard let jsonData = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: Any] else { // 変換失敗 return } print(jsonData) //JSONデータをパースする let prefix1 = jsonData["prefix_1"] as? String print("ここからprefix1の中身") print(prefix1) } // 通信開始 task.resume() } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } */ }

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

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

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

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

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

guest

回答2

0

ベストアンサー

簡単ではありますが、取得してモデルを使用する様に書いてみました。
参考にしてみてください。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 // データの配列 6 var dataArray: Array<DataModel> = [] 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 12 guard let url = URL(string: "http://www.XXXXXXXXX") else { 13 return 14 } 15 16 let request = URLRequest(url: url) 17 let config = URLSessionConfiguration.default 18 let session = URLSession(configuration: config, delegate: nil, delegateQueue: OperationQueue.main) 19 20 let task = session.dataTask(with: request) { data, response, error in 21 22 if let _ = response, let data = data { 23 24 print(NSString(data: data, encoding: String.Encoding.utf8.rawValue) ?? "") 25 26 do { 27 28 let jsonArray = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! NSArray 29 30 for data in jsonArray { 31 if let dict = data as? NSDictionary { 32 self.dataArray.append(DataModel(dict: dict)) 33 } 34 } 35 36 print("------------------------") 37 dump(self.dataArray) 38 print("------------------------") 39 40 41 print(self.dataArray.first?.prefix_1 ?? "") 42 //=> "bene" 43 44 } catch { 45 46 } 47 48 } else { 49 // Error 50 } 51 } 52 53 task.resume() 54 } 55} 56 57 58class DataModel { 59 60 var prefix_1 : String? 61 var prefix_1_mean : String? 62 var prefix_1_image: String? 63 var prefix_2 : String? 64 var prefix_2_mean : String? 65 var prefix_2_image: String? 66 var radix_1 : String? 67 var radix_1_mean : String? 68 var radix_1_image : String? 69 var radix_2 : String? 70 var radix_2_mean : String? 71 var radix_2_image : String? 72 var suffix_1 : String? 73 var suffix_1_mean : String? 74 var suffix_1_image: String? 75 var suffix_2 : String? 76 var suffix_2_mean : String? 77 var suffix_2_image: String? 78 var meaning : String? 79 var story_1 : String? 80 var story_2 : String? 81 var story_3 : String? 82 var story_4 : String? 83 var story_5 : String? 84 var example : String? 85 var ja_example : String? 86 87 init(dict: NSDictionary) { 88 prefix_1 = dict["prefix_1"] as? String 89 prefix_1_mean = dict["prefix_1_mean"] as? String 90 prefix_1_image = dict["prefix_1_image"] as? String 91 prefix_2 = dict["prefix_2"] as? String 92 prefix_2_mean = dict["prefix_2_mean"] as? String 93 prefix_2_image = dict["prefix_2_image"] as? String 94 radix_1 = dict["radix_1"] as? String 95 radix_1_mean = dict["radix_1_mean"] as? String 96 radix_1_image = dict["radix_1_image"] as? String 97 radix_2 = dict["radix_2"] as? String 98 radix_2_mean = dict["radix_2_mean"] as? String 99 radix_2_image = dict["radix_2_image"] as? String 100 suffix_1 = dict["suffix_1"] as? String 101 suffix_1_mean = dict["suffix_1_mean"] as? String 102 suffix_1_image = dict["suffix_1_image"] as? String 103 suffix_2 = dict["suffix_2"] as? String 104 suffix_2_mean = dict["suffix_2_mean"] as? String 105 suffix_2_image = dict["suffix_2_image"] as? String 106 meaning = dict["meaning"] as? String 107 story_1 = dict["story_1"] as? String 108 story_2 = dict["story_2"] as? String 109 story_3 = dict["story_3"] as? String 110 story_4 = dict["story_4"] as? String 111 story_5 = dict["story_5"] as? String 112 example = dict["example"] as? String 113 ja_example = dict["ja_example"] as? String 114 } 115}

投稿2017/01/11 15:48

編集2017/01/11 15:51
_Kentarou

総合スコア8490

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

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

bruteberry

2017/01/13 05:22

ありがとうございました!!! なんとかなりそうです
guest

0

元のJSONが分からないので何ともですが、パース後のprint()の出力を見るとトップレベルはNSArrayのようなので、

swift

1//let prefix1 = jsonData["prefix_1"] as? String 2let prefix1 = jsonData[0]["prefix_1"] as? String

で取れないでしょうか?

print("ここからprefix1の中身")が実行されてないっぽい

上のコードのところで落ちているのではないですか?

投稿2017/01/12 01:41

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問