无法转换types的值 – Swift

我有解决在Swift中的问题,它说我不能将[Dictionary]types的值转换为types[String:AnyObject]这是导致错误的行

self.grabData(json: json as [String : AnyObject]) 

这是整个代码。 谢谢!

  func jsonParser() { let urlPath = "http://csmadison.dhcp.bsu.edu/~vjtanksale/cs320/selectstudents.php" guard let endpoint = URL(string: urlPath) else { print("Error creating endpoint") return } let request = URLRequest(url: endpoint) URLSession.shared.dataTask(with: request) { (data, response, error) in do { guard let data = data else { return } guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [Dictionary<String, Any?>] else { print("No idea") return } print(json) self.grabData(json: json as [String : AnyObject]) // This is where I get the error } catch let error as NSError { print(error.debugDescription) } }.resume() } func grabData(json: [String:AnyObject]) { guard let searchResult = SearchResult(json: json) else { return } self.results.append(searchResult) DispatchQueue.main.async { self.listTableView.reloadData() } } 

您收到错误的原因是因为您正试图将[[String:Any?]][String:AnyObject]

尝试改变

 guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [Dictionary<String, Any?>] 

 guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [[String:AnyObject]] 

然后你需要遍历你的JSON结果的每个对象:

 for result in json { if let student = SearchResult(json: result) { self.results.append(student) } } self.grabData() 

另外,将您的grabData函数更改为下面的代码,或将表视图的重新加载与您的jsonParser函数结合起来。

 func grabData() { DispatchQueue.main.async { self.listTableView.reloadData() } } 

所以一起,它会喜欢:

 func jsonParser() { let urlPath = "http://csmadison.dhcp.bsu.edu/~vjtanksale/cs320/selectstudents.php" guard let endpoint = URL(string: urlPath) else { print("Error creating endpoint") return } let request = URLRequest(url: endpoint) URLSession.shared.dataTask(with: request) { (data, response, error) in do { guard let data = data else { return } guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [[String:AnyObject]] else { print("No idea") return } print(json) for result in json { if let student = SearchResult(json: result) { self.results.append(student) } } self.grabData() } catch let error as NSError { print(error.debugDescription) } }.resume() } func grabData() { DispatchQueue.main.async { self.listTableView.reloadData() } } 

这里的参考是SearchResult.swift

 struct SearchResult { let studentID: Int? let lastName: String? let firstName: String? let major: String? let year: String? let gpa: Double? init(json: [String:AnyObject]) { if let studentID = json["StudentID"] as? Int { self.studentID = studentID } else { self.studentID = nil } if let lastName = json["LastName"] as? String { self.lastName = lastName } else { self.lastName = nil } if let firstName = json["FirstName"] as? String { self.firstName = firstName } else { self.firstName = nil } if let major = json["Major"] as? String { self.major = major } else { self.major = nil } if let year = json["Year"] as? String { self.year = year } else { self.year = nil } if let gpa = json["GPA"] as? Double { self.gpa = gpa } else { self.gpa = nil } } } 

根据错误消息,你应该得到一个字典数组。 试试这一行:

 self.grabData(json: json as [[String : AnyObject]])