如何检查URLSessionDataTask响应数据是数组还是字典?

时间:2017-09-02 21:21:06

标签: swift nsurlsession

每次我收到错误:

  

jsonError :: Error Domain = NSCocoaErrorDomain Code = 3840“字符1周围的值无效。” UserInfo = {NSDebugDescription =字符1周围的值无效}}

let dataTask: URLSessionDataTask = session.dataTask(with: urlRequest as URLRequest) { (data:Data?, response:URLResponse?,error: Error?) in
    if((error) != nil){
        completionHandler(false, nil, error)
    }
    else{
        do {
            let responseData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments)

            if responseData is Dictionary<String, Any>{
                print("dictionary type")
            }
            else if responseData is Array<Any>{
                print("array type")
            }
        }
        catch let jsonError {
            print("jsonError::\(jsonError)")
            completionHandler(false, nil, jsonError)
        }

    }


}

dataTask.resume();

请建议。提前致谢。

1 个答案:

答案 0 :(得分:0)

错误(指向您实际检查错误,令人惊讶的是,有多少人在不这样做的情况下提出问题)告诉您,您收到的数据根本不是有效的JSON。

您说您收到了带有html代码的回复。这意味着服务器代码中断,或者使用不正确的URL或不正确的参数。如果您要求它们返回JSON,许多服务器将返回JSON,否则返回HTML,因此您只需要弄清楚如何正确地询问。 (通常您只需在浏览器中键入URL的变体即可找到)。

我注意到你使用了.allowFragments。此选项允许解析器不仅解析字典和数组,还解析“片段”,即字符串,数字,布尔值或null。显然在这些情况下你不会得到字典或数组,所以除非你期望一个片段并知道如何处理它,否则不要使用这个选项。

您似乎期望字典或包含单个字典的数组。 (我先询问是否可以接受空数组或包含多个字典的数组,如果是,则需要更改代码)。我假设您要在所有错误情况下报告错误。我会像这样编写dataTask完成处理程序(由你来编译)

guard error == nil else { 
    handle error
    return
}

guard data != nil else else { 
    handle error
    return
}

guard let parsed = try? JSONSerialization.jsonObject (...) else { 
    handle error
    return
}

if let dict = parsed as? [String: Any] {
    handle result dict
    return 
}

guard let array = parsed as? [Any] else { 
    handle error
    return
}

guard array.count == 1 else { 
    handle error
    return
}

if let dict = array [0] as? [String: Any] {
    handle result dict
} else {
    handle error 
}