ios - 如何使用 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()
}
}
解决方案
首先:始终处理错误并安全地打开选项。
其次,Data
和Error
(大写)是保留字,在闭包中总是使用小写的参数标签(和大写的类名)。
代码中的许多行都是多余的。
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
做法
推荐阅读
- javascript - 提供两种不同类型的边缘,并保持一种具有自身功能的不可移动
- python-3.x - 通过 pip 安装 pycups 缺少 cups.h?
- flutter - FormState vs FormFieldState,什么时候用哪个?
- filter - PowerPivot 计算总和
- javascript - 键入文本后光标停留在特定文本输入中
- r - 使用 dplyr 删除数据框中的组
- java - 如何在预定时间使番石榴缓存失效?
- azure-sql-database - 使用 Azure 托管标识访问 Azure SQL DB
- python - 使用 Python 从 JSON API 中提取值
- node.js - 如何在 NodeJs 中使用多个线程?