我在Swift中解析时遇到问题,它说我无法将[Dictionary]类型的值转换为[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()
}
}
答案 0 :(得分:0)
根据错误消息,您应该获得一个字典数组。 试试这一行:
self.grabData(json: json as [[String : AnyObject]])
答案 1 :(得分: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
}
}
}