我正在使用Swift从冠状病毒API获取JSON。但是当我尝试运行代码时,我得到了这个错误。
致命错误:展开可选值时意外发现nil:第22行
我的代码是
override func viewDidLoad() {
super.viewDidLoad()
let url = "https://api.coronavirus.data.gov.uk/v1/data?filters=areaType=nation;areaName=england&structure={%22date%22:%22date%22,%22areaName%22:%22areaName%22,%22areaCode%22:%22areaCode%22,%22newCasesByPublishDate%22:%22newCasesByPublishDate%22,%22cumCasesByPublishDate%22:%22cumCasesByPublishDate%22,%22newDeathsByDeathDate%22:%22newDeathsByDeathDate%22,%22cumDeathsByDeathDate%22:%22cumDeathsByDeathDate%22}"
getData(from: url)
// Do any additional setup after loading the view.
}
private func getData(from url: String) {
let getfromurl = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: {data, response, error in
guard let data = data, error == nil else{
print("Something Went Wrong")
return
}
//Have data
var result: Response?
do {
result = try JSONDecoder().decode(Response.self, from: data)
}
catch{
print("failed to convert \(error.localizedDescription)")
}
guard let json = result else {
return
}
print(json.data.date)
})
getfromurl.resume()
}
第22行为:
let getfromurl = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: {data, response, error in
我很困惑,因为我认为这意味着url
没有分配任何内容,但即使调试器也认为它有。
- 更新日期:**
我可以获取数据,但获取后出现错误。错误为:
无法转换值NotFound(Swift.Int、Swift.DecodingError.上下文(编码路径:[编码键(字符串值:"数据",整数值:nil)、_JSONKey(字符串值:"索引0",整数值:0)、编码键(字符串值:"按死亡日期的新死亡",整数值:nil)],调试说明:"应为Int值,但找到null。",underlyingError:无))
转换失败表明在解码JSON和值时出错。
3条答案
按热度按时间mw3dktmi1#
该异常并不意味着
url
就是nil
,但是URL(string:url)
就是nil
您需要检查
url
字符串是否为有效的url:更新
由于现在给出了url字符串:问题出在花括号上它们在RFC1738中被标记为 * unsafe *,并且应该被
%7b
(打开)和%7d
(关闭)替换,因此:这也是official API documentation中的一个示例:
bn31dyow2#
URL编码不正确。浏览器有自己的方式来编码URL,但
URL(string:
根本不进行任何编码。对于这种复杂的URL,建议使用
URLComponents
/URLQueryItem
创建它。URLComponents
的好处是它可以代表您处理编码旁注:
JSONDecoder
catch块中打印error.localizedDescription
。它只向您显示无意义的一般错误消息。始终为print(error)
ghhkc1vu3#
在getData方法中进行了更改,请尝试一次