无法转换类型的值 - Swift

时间:2016-11-17 19:32:19

标签: ios swift

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

2 个答案:

答案 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
        }
    }
}