Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios &引用;预计将解码阵列<;任何>;而是找到了一本字典。”;,参考误差:零)_Ios_Json_Swift_Api_Decodable - Fatal编程技术网

Ios &引用;预计将解码阵列<;任何>;而是找到了一本字典。”;,参考误差:零)

Ios &引用;预计将解码阵列<;任何>;而是找到了一本字典。”;,参考误差:零),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:

我正在尝试做一个新闻应用程序,我遇到了这个问题

未能下载数据:类型不匹配(Swift.Array, Swift.DecodingError.Context(编码路径:[],调试说明: “应解码数组,但找到了字典。”, 参考误差:零)

我试图找到nil,因为我在stackoverflow中看到了一些不同的答案,但什么都没有

导入UIKit

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:[课程]}你们能帮帮我吗!