“预期对Array <Any>进行解码,但找到了一个字典。”,底层错误:nil))

时间:2019-10-14 12:38:58

标签: ios json swift api decodable

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

  

无法下载数据:typeMismatch(Swift.Array,   Swift.DecodingError.Context(codingPath:[],debugDescription:   “打算对数组进行解码,但是找到了一个字典。”,   底层错误:nil))

我试图找到nil,因为我在堆栈溢出中看到了一些不同的答案,但是什么也没有!

导入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()
    }
}

我需要它来接收来自此来源https://newsapi.org的数据

1 个答案:

答案 0 :(得分:0)

阅读您的错误消息。

那是因为您的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并使其成为字符串。