2016-11-17 68 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]]) 
相關問題