首页 > 解决方案 > 如何使用 init() 解析 JSON

问题描述

我无法json Array通过使用它的对象来显示

显示此错误:

“线程 1:致命错误:在展开可选值时意外发现 nil”

class sample{

    var jarray:[[String:Any]]!

    init(url: String) {


        let urll = URL(string: url)
        var request              = URLRequest(url: urll!)
        request.httpMethod        = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        let task                 = URLSession.shared.dataTask(with: request, completionHandler: {(Data,response,Error) in
            do
            {
                let jsonresponse = try  JSONSerialization.jsonObject(with: Data!, options: [])
                let jsonarray    = jsonresponse as? [[String:Any]]
                self.jarray       = jsonarray!
                print(self.jarray)
                DispatchQueue.main.async {

                }

            }
            catch let parsingerror
            {
                print("error",parsingerror)
            }
        })
        task.resume()
    }

}

标签: iosjsonswift

解决方案


首先:始终处理错误并安全地打开选项。

其次,DataError(大写)是保留字,在闭包中总是使用小写的参数标签(和大写的类名)。

代码中的许多行都是多余的。

class Sample {

    var jarray  = [[String:Any]]()

    init(url: String) {
        guard let urll = URL(string: url) else { return }

        let task = URLSession.shared.dataTask(with: urll) { data, _ , error in
            if let error = error { print(error); return }
            do
            {
                // if error is nil then data is guaranteed to be non-nil
                if let jsonarray = try JSONSerialization.jsonObject(with: data!) as? [[String:Any]] {
                    self.jarray = jsonarray
                    print(self.jarray)
                    DispatchQueue.main.async {

                    }
                }
            }
            catch {
                print("error", error)
            }
        }
        task.resume()
    }
}

注意:在方法中运行异步任务是不好的init做法


推荐阅读