Swift 3 JSON Bug?

时间:2017-07-11 06:06:17

标签: json swift

无论我多么愚弄它,我似乎无法编译我的代码。我想我需要另一种观点。

在"让图像=数据["图像"]为! [String:AnyObject]"

xcode一直告诉我"不能下标类型' [[String:AnyObject]]'索引类型为' String'"

func retreiveInstagramMedia() {
    let token = user?.token
    let urlString = "https://api.instagram.com/v1/users/self/media/recent/?access_token=\(token!)"
    let url = URL(string: urlString)
    URLSession.shared.dataTask(with: url!, completionHandler: {
        (data, response, error) in
        if(error != nil){
            print("error")
        }else{
            do{
                let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String : AnyObject]

                if let data = json["data"] as? [[String : AnyObject]] {
                        let image = data["images"] as! [String : AnyObject]
                        let standardResolution = image["standard_resolution"] as! [String : AnyObject]
                        let url = standardResolution["url"] as! String
                        print(url)


                }

                OperationQueue.main.addOperation({
                    self.tableView.reloadData()
                })

            }catch let error as NSError{
                print(error)
            }
        }
    }).resume()
}

2 个答案:

答案 0 :(得分:1)

首先在Swift 3中,JSON字典为[String:Any]

您的错误(开发人员错误)是使用数组data作为循环的索引变量。 将下划线替换为anItem,并使用anItem["images"]

获取图像
   let json = try JSONSerialization.jsonObject(with: data!) as! [String : Any]

    if let data = json["data"] as? [[String : Any]] {
        for anItem in data {
            let image = anItem["images"] as! [String : Any]
            let standardResolution = image["standard_resolution"] as! [String : Any]
            let url = standardResolution["url"] as! String
            print(url)
        }
    }

注意:键images表示多个项目,因此值也可以是数组。

答案 1 :(得分:1)

正如马丁所说,你的data是一系列词典。因此,遍历这些词典:

if let arrayOfData = json["data"] as? [[String : Any]] {
    for individualData in arrayOfData {
        if let image = individualData["images"] as? [String : Any], 
            let standardResolution = image["standard_resolution"] as? [String : Any], 
            let url = standardResolution["url"] as? String {
                // now do something with URL
                print(url)
        }
    }
}

我建议你不要使用!来强制施放/解包。处理来自远程数据源的数据时,您应该更优雅地处理其中一个下标无法检索到您期望的情况。