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

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

ただいまの
回答率

87.90%

SwiftでのJSON型データ受け渡し

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,117

score 28

//製品ごとに紐付けている独自のIDからを栄養素を取得
func foodGet(fid:String) {
//省略
}

func tableView(tableVIew: UITableView, numberOfRowsInSection section: Int) -> Int{
    return nutritions.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
    let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: "cell")
    let nutrition = nutritions[indexPath.row]
    cell.textLabel?.text = nutrition["food_id"]!
    return cell
}

//バーコードから製品ごとに紐付いている独自のIDを取得
func foodFindIdForBarcode(barcode:String) { 
//省略   
        Alamofire.request(.GET, URL, parameters: parameters)
            .responseJSON { response in
                guard let object = response.result.value else {
                    return
                }
                let json = JSON(object)
                json.forEach { (_, json) in
                    let nutrition: [String: String?] = [
                        "barcode": json["barcode"].string
                    ]
                    self.nutritions.append(nutrition)
                }
                self.foodGet(json["barcode"] as! String)
                self.table.reloadData()

                if let JSON = response.result.value {
                    print("JSON: \(JSON)")
                }
        }
    }

やりたいことは下記です。

  1. バーコードをスキャン
  2. 1で製品情報を取得し、独自のDBに保有している世界中のすべての製品ごとのIDを取得
  3. 2から当該製品の栄養素を取得

したがって、2(foodFindIdForBarcode)で取得したIDを3(foodGet)へ渡す必要があります。
通常のデータ型であれば下記のように値を渡すことは容易なのですが、
JSON型だとどうも上手くいきません。

self.foodGet(fid as! String)

これで2週間以上躓いております...。
下記コードだと強制終了となってしまいます。

self.foodGet(json["barcode"] as! String)

どなたかご教示ください。
よろしくお願いします!

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • takhub

    2016/09/08 15:57

    String型です。
    let fid = "3312535"
    と宣言し、
    self.foodGet(fid as! String)
    で動作します。

    print(json["barcode"])の出力いま初めて確認しましたが「null」でした...。

    キャンセル

  • fuzzball

    2016/09/08 16:06

    じゃあ、print(json)はどうでしょうか?

    キャンセル

  • takhub

    2016/09/08 16:09

    {
    "food_id" : {
    "value" : "3312535"
    }
    }

    となりました!この中のvalueを取得したいんです!

    キャンセル

回答 2

checkベストアンサー

+1

json["food_id"]["value"].string!で取れないでしょうか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/08 16:19

    自分もそう思います。
    てっきりjson["barcode"]があるのかと

    キャンセル

  • 2016/09/08 16:29

    できました!!
    fuzzballさん、Y_Mさん、お二方とも本当にありがとうございます。質問者の私自身が自分で書いたコードを理解しておらず混乱させてしまいました@_@ごめんなさい。
    BAは甲乙つけがたくて非常に悩みましたが、初めにレスポンスをくださり、解決に至るコードを記述していただいたfuzzballさんとさせていただきます。
    Y_Mさんもお助けくださり本当にありがとうございます!

    キャンセル

+1

self.foodGet(json["barcode"].string!)

なのではないですか?

追記

json.forEach { (_, json) in
                    let nutrition: [String: String?] = [
                        "barcode": json["barcode"].string
                    ]
                    self.nutritions.append(nutrition)
                }
                self.foodGet(json["barcode"] as! String)

よくよくみるとループしてnutritionnutritionsに突っ込んでいるみたいなので
json["barcode"].string!したところでnilになりますよねそりゃ。。。

JSONの情報のなかでbarcode単体なら,
ループは外してあげれば良いし、今回はそうではなさそうなので

json.forEach { (_, json) in
                    let nutrition: [String: String?] = [
                        "barcode": json["barcode"].string
                    ]
                    self.foodGet(json["barcode"].string!)
                    self.nutritions.append(nutrition)
                }


こうやればJSON内のすべてのbarcode情報を渡せませんかね?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/08 16:13

    詳しくご教示いただきありがとうございます。
    ご指摘の通りやってみたのですが、やはりfatal errorとなってしまいます。

    キャンセル

  • 2016/09/08 16:15

    んん?
    { "food_id" : { "value" : "3312535" } }の"value"を取得してfoodGetに投げたいんですか?

    キャンセル

  • 2016/09/08 16:19

    わかりづらくてすみません...。正確には3312535を取得してfoodGetに投げたいです。

    キャンセル

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

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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