Swift 3 中的 JSON 序列化

4
我正在尝试通过从JSON数据中填充数组来填充表格。我使用下面的代码,但一直收到以下错误提示:

类型“Any”没有下标成员

在以下代码行:
self.tableData.append(jsonResult[i]["title"]! as! String)
self.tableImages.append(jsonResult[i]["image"]! as! String)
self.tableDesc.append(jsonResult[i]["description"]! as! String)
self.tableValidity.append(jsonResult[i]["validity"]! as! String)

我的代码:

 let str3 = Int(str2!)!
            let url = NSURL(string: "https://www.*****.php")!

            let task = URLSession.shared.dataTask(with: url as URL) { (data, response, error) -> Void in
                if let urlContent = data {
                    do {

                        let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers)


                        print(str3)

                        var i = 0

                        while i < str3 {
                            print(jsonResult[i]["title"]! as!String)
                            print(jsonResult[i]["image"]! as! String)

                            self.tableData.append(jsonResult[i]["title"]! as! String)
                            self.tableImages.append(jsonResult[i]["image"]! as! String)
                            self.tableDesc.append(jsonResult[i]["description"]! as! String)
                            self.tableValidity.append(jsonResult[i]["validity"]! as! String)

                            i = i + 1

                        }

                    } catch {
                        print("JSON serialization failed")
                    }                    

                } else {                    
                    print("ERROR FOUND HERE")
                }                

                DispatchQueue.main.async(execute: { () -> Void in

                    self.tableView.reloadData()

                })                                

            }

            task.resume()

1
你看到最近的博客文章了吗:https://developer.apple.com/swift/blog/?id=37? - koen
2个回答

4
编译器不知道jsonResult的类型,你需要告诉它是什么,例如可以使用可选绑定来实现:
if let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: []) as? [[String:AnyObject]] {


}

在这里,我将JSON向下转换为一个字典数组。在if let语句中使用您的循环即可使其正常工作。


4
编译器不知道JSON对象的类型,您需要将其转换为实际类型。
let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options:[]) as! [[String:Any]]

完全不需要可变容器。

C-while循环并增加计数器非常丑陋,在Swift中不要使用它。而且你使用了太多的感叹号。

for item in jsonResult {

  print(item["title"] as! String)
  print(item["image"] as! String)

  self.tableData.append(item["title"] as! String)
  self.tableImages.append(item["image"] as! String)
  self.tableDesc.append(item["description"] as! String)
  self.tableValidity.append(item["validity"] as! String)

}

PS:多个数组作为数据源也很笨拙且容易出错。在面向对象的语言中,使用自定义的结构体或类更可取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接