2016-11-17 11 views
0

Ich habe ein Problem mit der Analyse in Swift, wo es heißt, ich kann Wert des Typs [Dictionary] nicht konvertieren, um [String: AnyObject] Dies ist die Zeile, die verursacht Der FehlerWert des Typs kann nicht konvertiert werden - Swift

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

Dies ist der gesamte Code. Vielen Dank!

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

Antwort

0

Der Grund, warum Sie eine Fehlermeldung erhalten, weil Sie einen [[String:Any?]] zu [String:AnyObject] konvertieren möchten.

Versuchen Sie,

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

zu

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

Dann müssen Sie durch jedes Objekt Ihrer JSON Ergebnis Schleife:

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

self.grabData() 

Auch Ihre grabData Funktion, um den Code ändern unten oder kombinieren Sie das Neuladen der Tabellenansicht mit Ihrer jsonParser-Funktion.

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

Also alles zusammen würde es mögen:

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

als Referenz hier ist 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

Dies das Problem behoben. Allerdings ist mein Ergebniswörterbuch danach leer. Nur json hat Daten drin. – tncb

+0

Ist 'result' beim Looping leer? oder sind deine 'self.results' leer? –

+0

Beide sind leer. Ich glaube, dass das Ergebnis in JSON-Schleife es nicht anhängt. – tncb

0

Nach der Fehlermeldung, sollten Sie ein Array von Wörterbücher bekommen. versuchen, diese Zeile:

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