Msgstr "Предполагается декодировать массив <Any>, но вместо этого найден словарь.", UnderError: nil)) - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь создать приложение NEWS и столкнулся с этой проблемой!

Не удалось загрузить данные: typeMismatch (Swift.Array, Swift.DecodingError.Context (codingPath: [], debugDescription:Msgstr "Ожидается декодировать массив, но вместо этого найден словарь.", UnderError: nil))

Я попытался найти nil, так как увидел несколько разных ответов в переполнении стека, но ничего!

import 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 голосов
/ 14 октября 2019

Прочитайте ваше сообщение об ошибке.

Это потому, что ваш 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» в этих ответах. корень каждого объекта. Сделайте его необязательным и / или добавьте вложенный объект для «исходного» объекта, который в конечном итоге содержит идентификатор, и сделайте его строкой.

...