Ios &引用;预计将解码阵列<;任何>;而是找到了一本字典。”;,参考误差:零)
我正在尝试做一个新闻应用程序,我遇到了这个问题 未能下载数据:类型不匹配(Swift.Array, Swift.DecodingError.Context(编码路径:[],调试说明: “应解码数组,但找到了字典。”, 参考误差:零) 我试图找到nil,因为我在stackoverflow中看到了一些不同的答案,但什么都没有 导入UIKitIos &引用;预计将解码阵列<;任何>;而是找到了一本字典。”;,参考误差:零),ios,json,swift,api,decodable,Ios,Json,Swift,Api,Decodable,我正在尝试做一个新闻应用程序,我遇到了这个问题 未能下载数据:类型不匹配(Swift.Array, Swift.DecodingError.Context(编码路径:[],调试说明: “应解码数组,但找到了字典。”, 参考误差:零) 我试图找到nil,因为我在stackoverflow中看到了一些不同的答案,但什么都没有 导入UIKit struct Course: Decodable { let id: Int let name: String let author:
struct Course: Decodable {
let id: Int
let name: String
let author: String
let title: String
let description: String
let urlToImage: String
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
fetchCoursesJSON { (res) in
switch res {
case .success(let courses):
courses.forEach({ (course) in
print(course.name)
})
case.failure(let err):
print("Failed to download data:", err)
}
}
}
fileprivate func fetchCoursesJSON(completion: @escaping (Result<[Course], Error>) -> ()) {
let urlString = "https://newsapi.org/v2/everything?q=bitcoin&from=2019-09-14&sortBy=publishedAt&apiKey=3e3e7d9bd50149e69c194e810666b756"
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { (data, resp, err) in
if let err = err {
completion(.failure(err))
return
}
//Successful
do {
let courses = try JSONDecoder().decode([Course].self, from: data!)
completion(.success(courses))
} catch let jsonError {
completion(.failure(jsonError))
}
}.resume()
}
}
struct课程:可解码{
让id:Int
let name:String
让作者:字符串
标题:字符串
let description:字符串
让urlToImage:String
}
类ViewController:UIViewController{
重写func viewDidLoad(){
super.viewDidLoad()
fetchCoursesJSON{(res)在
开关res{
成功案例(let课程):
课程。forEach({(课程)在
打印(课程名称)
})
案例。失败(错误):
打印(“下载数据失败:”,错误)
}
}
}
fileprivate func fetchCoursesJSON(完成:@escaping(Result)->()){
让URL字符串=”https://newsapi.org/v2/everything?q=bitcoin&from=2019-09-14&sortBy=publishedAt&apiKey=3e3e7d9bd50149e69c194e810666b756“
guard let url=url(字符串:urlString)else{return}
URLSession.shared.dataTask(带:url){(data,resp,err)在
如果让err=err{
完成(.failure(err))
返回
}
//成功的
做{
let courses=尝试JSONDecoder().decode([Course].self,from:data!)
完成(.success(课程))
}接住让杰森罗{
完成(.failure(jsonError))
}
}1.简历()
}
}
我需要它来接收来自此源的数据读取您的错误消息 这是因为您的JSON如下所示:
{
"status": "ok",
"totalResults": 5576,
"articles": [
{
"source": {
"id": null,
"name": "Newsbtc.com"
},
"author": "Davit Babayan",
"title": "US Senators Coercing Libra Partners is Un-American: Coinbase CEO",
"description": "Facebook’s plan to launch Libra came under further pressure after its partners Visa, Mastercard, Paypal, and Stripe announced that they were leaving the digital currency project. And as it turned out, there was some political pushing involved. Senator Brian S…",
"url": "https://www.newsbtc.com/2019/10/14/us-senators-coercing-libra-partners-is-un-american-coinbase-ceo/",
"urlToImage": "https://www.newsbtc.com/wp-content/uploads/2019/10/shutterstock_1492511210-1200x780.jpg",
"publishedAt": "2019-10-14T15:05:53Z",
"content": "Facebook’s plan to launch Libra came under further pressure after its partners Visa, Mastercard, Paypal, and Stripe announced that they were leaving the digital currency project. And as it turned out, there was some political pushing involved.\r\nSenator Brian … [+2871 chars]"
},
然后告诉解码器解析嵌套在另一个json对象中的对象数组。
创建一个包含数组的“根”对象,并将其传递给jsondecoder
struct NewsResponse: Decodable {
let articles: [Course]
}
另外,查看响应,您将得到下一个错误,因为在每个对象的根中,这些响应上没有“id”。将其设置为可选和/或为最终包含id的“源”对象添加嵌套对象,并将其设置为字符串。请注意,
课程
结构包含id
属性,该属性实际上嵌套在源
对象中。这将产生另一个解析错误。非常感谢您的回复,我是否应该替换为这一部分?struct NewsResponse:Decodable{let articles:[课程]}你们能帮帮我吗!