2016-11-17 114 views
0

我在解析Swift时遇到问题,它说我无法将[Dictionary]类型的值转换为类型[String:AnyObject] 这是导致错误无法转换类型的值 - Swift

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() 
    } 
} 

回答

0

你得到一个错误的原因是因为你正试图转换到[[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 
     } 
    } 
} 
+0

这个固定的问题。然而,我的结果字典在这之后是空的。只有json有数据。 – tncb

+0

循环时'result'为空吗?或者你的'self.results'是空的? –

+0

他们都是空的。我相信在json循环中的结果不会附加它。 – tncb

0

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

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