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
methods

json中运行异步任务是一种不好的做法。序列化现在是一种老式的方式。苹果公司推出了一种协议,可以为您处理对象的序列化和反序列化

:

在服务器的响应中:

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)
}