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

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

ただいまの
回答率

92.01%

  • Swift

    3553questions

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

  • iOS

    2248questions

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

  • Xcode

    2061questions

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

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

解決済

回答 2

投稿 2017/01/11 19:46 ・編集 2017/01/13 14:30

  • 評価
  • クリップ 0
  • VIEW 213

bruteberry

score 14

前提・実現したいこと

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.
   }
   */

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

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

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

import UIKit

class ViewController: UIViewController {

    // データの配列
    var dataArray: Array<DataModel> = []

    override func viewDidLoad() {
        super.viewDidLoad()


        guard let url = URL(string: "http://www.XXXXXXXXX") else {
            return
        }

        let request = URLRequest(url: url)
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config, delegate: nil, delegateQueue: OperationQueue.main)

        let task = session.dataTask(with: request) { data, response, error in

            if let _ = response, let data = data {

                print(NSString(data: data, encoding: String.Encoding.utf8.rawValue) ?? "")

                do {

                    let jsonArray = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! NSArray

                    for data in jsonArray {
                        if let dict = data as? NSDictionary {
                            self.dataArray.append(DataModel(dict: dict))
                        }
                    }

                    print("------------------------")
                    dump(self.dataArray)
                    print("------------------------")


                    print(self.dataArray.first?.prefix_1 ?? "")
                    //=> "bene"

                } catch {

                }

            } else {
                // Error
            }
        }

        task.resume()
    }
}


class DataModel {

    var prefix_1      : String?
    var prefix_1_mean : String?
    var prefix_1_image: String?
    var prefix_2      : String?
    var prefix_2_mean : String?
    var prefix_2_image: String?
    var radix_1       : String?
    var radix_1_mean  : String?
    var radix_1_image : String?
    var radix_2       : String?
    var radix_2_mean  : String?
    var radix_2_image : String?
    var suffix_1      : String?
    var suffix_1_mean : String?
    var suffix_1_image: String?
    var suffix_2      : String?
    var suffix_2_mean : String?
    var suffix_2_image: String?
    var meaning       : String?
    var story_1       : String?
    var story_2       : String?
    var story_3       : String?
    var story_4       : String?
    var story_5       : String?
    var example       : String?
    var ja_example    : String?

    init(dict: NSDictionary) {
        prefix_1       = dict["prefix_1"] as? String
        prefix_1_mean  = dict["prefix_1_mean"] as? String
        prefix_1_image = dict["prefix_1_image"] as? String
        prefix_2       = dict["prefix_2"] as? String
        prefix_2_mean  = dict["prefix_2_mean"] as? String
        prefix_2_image = dict["prefix_2_image"] as? String
        radix_1        = dict["radix_1"] as? String
        radix_1_mean   = dict["radix_1_mean"] as? String
        radix_1_image  = dict["radix_1_image"] as? String
        radix_2        = dict["radix_2"] as? String
        radix_2_mean   = dict["radix_2_mean"] as? String
        radix_2_image  = dict["radix_2_image"] as? String
        suffix_1       = dict["suffix_1"] as? String
        suffix_1_mean  = dict["suffix_1_mean"] as? String
        suffix_1_image = dict["suffix_1_image"] as? String
        suffix_2       = dict["suffix_2"] as? String
        suffix_2_mean  = dict["suffix_2_mean"] as? String
        suffix_2_image = dict["suffix_2_image"] as? String
        meaning        = dict["meaning"] as? String
        story_1        = dict["story_1"] as? String
        story_2        = dict["story_2"] as? String
        story_3        = dict["story_3"] as? String
        story_4        = dict["story_4"] as? String
        story_5        = dict["story_5"] as? String
        example        = dict["example"] as? String
        ja_example     = dict["ja_example"] as? String
    }
}

投稿 2017/01/12 00:48

編集 2017/01/12 00:50

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/01/13 14:22

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

    キャンセル

0

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

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

で取れないでしょうか?

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

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

投稿 2017/01/12 10:41

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

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

ただいまの回答率

92.01%

関連した質問

  • 解決済

    【swift】サーバーに置いてある画像をSNSシェアしたい

    swiftを勉強中の者です。 タイトルの通り、サーバーに置いてる画像をSNSでシェアできるように実装したいと考えてます。 Socialフレームワークを使ってTwitte

  • 解決済

    swift3.0でAPIを使いたい

    xcode8でswift3.0を勉強している初心者です。 swift3.0のバージョンアップに伴い、既存のテキストやサンプルコードが一部変更され、 もともとのコードもわからない

  • 解決済

    Swift エラー NSURLSession

    前提・実現したいこと プログラム初心者です。 「swiftではじめる iphoneアプリ開発の教科書 【swift 2&xcode 7対応】」という本のChapter5の「住所

  • 解決済

    iOSでGoogle Custom Searchを使いたい

    前提・実現したいこと iOSアプリにて、wordImageという名前でOutlet接続したUIImageViewにGoogle Custom Searchエンジンを使用した検索結

同じタグがついた質問を見る

  • Swift

    3553questions

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

  • iOS

    2248questions

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

  • Xcode

    2061questions

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

閲覧数の多いiOSの質問