Как разобрать JSON с помощью init () - PullRequest
0 голосов
/ 21 мая 2019

Я не могу отобразить json Array, используя его объект

показывает эту ошибку:

"Поток 1: фатальная ошибка: неожиданно обнаружен ноль при развертывании Необязательное значение "

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

}

Ответы [ 3 ]

1 голос
/ 21 мая 2019

Прежде всего: Обработка ошибок всегда и безопасное развертывание опций.

Во-вторых, 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 методах

0 голосов
/ 21 мая 2019

JSONSerialization теперь является старомодным способом. Apple представила протокол Codable , который обрабатывает сериализацию и десериализацию объектов.

Пример :

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)
}
0 голосов
/ 21 мая 2019

Избегайте использования force unwrapping без необходимости . Я могу привести к нежелательным сбоям в вашем приложении. В вашем коде

Проверьте, является ли Data nil. Если это так, строка ниже приведет к исключению времени выполнения.

let jsonresponse = try  JSONSerialization.jsonObject(with: Data!, options: [])

В приведенной ниже строке кода проверьте, является ли jsonarray нулем.

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

Кроме того, не используйте reserved words в качестве имен переменных, как вы использовали для Data и Error.

Самое главное - Никогда не используйте forced unwrapping (!) с ответом сервера. Ответ API может быть не таким, как ожидалось всегда. Попробуйте справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...