gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:11:20 24 4
gpt4 key购买 nike

每次我收到以下错误:

jsonError::Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 1." UserInfo={NSDebugDescription=Invalid value around character 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();

请提出建议。提前致谢。

最佳答案

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

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

我注意到您使用了.allowFragments。此选项允许解析器不仅解析字典和数组,还解析“片段”,即字符串、数字、 bool 值或 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
}

关于swift - 如何检查 URLSessionDataTask 响应数据是数组还是字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46018297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com