Ios 如何使用init()解析JSON
我无法使用其对象显示Ios 如何使用init()解析JSON,ios,json,swift,Ios,Json,Swift,我无法使用其对象显示json数组 显示此错误: 线程1:致命错误:在展开线程时意外发现nil 可选值“ 避免不必要地使用强制展开。我可能会导致你的应用程序出现意外崩溃。在代码中 检查数据是否为nil。如果是,下面的行将导致运行时异常 let jsonresponse = try JSONSerialization.jsonObject(with: Data!, options: []) 在下面的代码行中,检查jsonarray是否为nil self.jarray = jsonarray!
json数组
显示此错误:
线程1:致命错误:在展开线程时意外发现nil
可选值“
避免不必要地使用
强制展开
。我可能会导致你的应用程序出现意外崩溃。在代码中
检查数据
是否为nil
。如果是,下面的行将导致运行时异常
let jsonresponse = try JSONSerialization.jsonObject(with: Data!, options: [])
在下面的代码行中,检查jsonarray
是否为nil
self.jarray = jsonarray!
如果没有,则添加应用程序崩溃的行
尝试将代码替换为:
class sample {
var jarray: [[String:Any]]?
init(url: String) {
if let urll = URL(string: url) {
URLSession.shared.dataTask(with: urll) { (data, response, error) in
do {
if let data = data {
let jsonresponse = try JSONSerialization.jsonObject(with: data, options: [])
self.jarray = jsonresponse as? [[String:Any]]
print(self.jarray)
DispatchQueue.main.async {
}
}
} catch {
print("error",error)
}
}.resume()
}
}
}
另外,不要像对待数据
和错误
那样使用保留字
作为变量名
最重要的是-切勿在服务器响应时使用
强制展开(!)
。API响应可能并非总是如预期的那样。尝试处理这些问题。首先:始终处理错误并安全地展开可选项。
其次,所有数据
和错误
(大写)都是保留字,在闭包中始终使用小写参数标签(和大写类名)
代码中的许多行是多余的
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
methodsjson中运行异步任务是一种不好的做法。序列化现在是一种老式的方式。苹果公司推出了一种协议,可以为您处理对象的序列化和反序列化
:
在服务器的响应中:
if let jsonData = jsonString.data(using: .utf8)
{
let photoObject = try? JSONDecoder().decode(Photo.self, from: jsonData)
}
在哪一行中,避免使用类名作为参数名,将我们的完成处理程序更改为…中的
(数据、响应、错误)
代码正在工作,但应用程序在使用类对象访问jarray时崩溃。这是什么意思?让obj=sample(url:)jarray1=obj.jarray//error here
struct Photo: Codable
{
//String, URL, Bool and Date conform to Codable.
var title: String
var url: URL
var isSample: Bool
//The Dictionary is of type [String:String] and String already conforms to Codable.
var metaData: [String:String]
//PhotoType and Size are also Codable types
var type: PhotoType
var size: Size
}
if let jsonData = jsonString.data(using: .utf8)
{
let photoObject = try? JSONDecoder().decode(Photo.self, from: jsonData)
}