NSJSONSerialization错误:为什么我无法捕获try catch块中的错误? swift 3.0

时间:2017-06-22 10:19:14

标签: ios iphone swift swift3

我正在调用REST API以从服务器获取响应,并且还测试了在try catch block nut应用程序中捕获的错误数据类型仍然崩溃,并出现以下错误:

  
    

无法转换类型' __ NSArrayM' (0x10575ee00)到' NSDictionary' (0x10575f2d8)。

  
    let dataTask = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {
            print(error!)
            return
        }

        do {

           let responseObject = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as! Dictionary<String,String>

            print(responseObject)

        } catch let jsonError {

            print(jsonError)
        }
    }
    dataTask.resume()

为此,我还找到了我应首先使用JSON格式检查数据然后使用JSONSerialization的解决方案。

if JSONSerialization.isValidJSONObject(data){
    responseObject = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as! Dictionary<String,String>

}
else {

    print("Error")

} 

我想知道如果try-catch块没有捕获到类型转换值错误,那么在网络调用中使用try-catch块是什么。我可以简单地检查{{ 1}}格式并传递响应对象。

什么是优秀的编程习惯?

注意:错误不是问题我只是不希望当数据类型从字典更改为数组或指定类型以外时我应该崩溃应用程序。

1 个答案:

答案 0 :(得分:2)

这不是有效的JSON,因为您的JSON根位于Array而不是Dictionary并且您正在尝试投射jsonObject(with:)的结果,导致此次崩溃{1}} Dictionary这也是导致此次崩溃的原因,因此无需使用Swift指定mutableContainers

do {

    let responseObject = try JSONSerialization.jsonObject(with: data, options: []) as! [[String:Any]]
    print(responseObject)

} catch let jsonError {

    print(jsonError)
}

编辑:如果您不知道JSON时间,那么您可以使用if like like。

do {

    let responseObject = try JSONSerialization.jsonObject(with: data, options: [])
    if let responseArray = responseObject as? [[String:Any]] {
        //Access array
    }
    else if let responseDictionary = responseObject as? [String:Any] {
        //Access dictionary
    }
    print(responseObject)

} catch let jsonError {

    print(jsonError)
}