Ошибка при декодировании JSON


#1

Здравствуйте, у меня есть код для декодинга JSON

struct NewsModel: Decodable {

let error: Int
let news: [NewsItem]

private enum CodingKeys : String, CodingKey {
    case news = "data"
    case error = "error"
}

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    news = try container.decode([NewsItem].self, forKey: .news)
    error = try container.decode(Int.self, forKey: .error)
}}



struct NewsItem: Decodable {
let id: Int
let title: String
let teaser: String
let delayDate: String
let category : Category

private enum CodingKeys : String, CodingKey {
    case id = "id"
    case title = "title"
    case delayDate = "delay_date"
    case teaser = "teaser"
    case category = "cat"
}

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    id = try container.decode(Int.self, forKey: .id)
    title = try container.decode(String.self, forKey: .title)
    teaser = try container.decode(String.self, forKey: .teaser)
    delayDate = try container.decode(String.self, forKey: .delayDate)
    category = try container.decode(Category.self, forKey: .category)
}}

struct Category: Decodable {

let id: Int
let languageId: String
let slug: String
let description: String

private enum CodingKeys : String, CodingKey {
    case id = "category_id"
    case language = "language_id"
    case slug = "slug"
    case description = "description"
}

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    id = try container.decode(Int.self, forKey: .id)
    languageId = try container.decode(String.self, forKey: .language)
    slug = try container.decode(String.self, forKey: .slug)
    description = try container.decode(String.self, forKey: .description)
}}

Тут все верно
А вот функция

var arrData = Article_Data
func getCoinData() {
    let jsonURL = "https://abctv.kz/ru/api/v1/getNewsByCategory?id=22"
    guard let url = URL(string: jsonURL) else { return }

    URLSession.shared.dataTask(with: url) { [unowned self] (data, response, error) in
        guard let data = data else { return }
        do {
            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            let data_new = try decoder.decode(News_data.self, from: data)

            DispatchQueue.main.async {
                self.arrData = data_new.data.news
                self.tableview.reloadData()
            }

        } catch {
            print("Error is : \n\(error)")
       }
        }.resume()
}

Вот JSON

 {"error": 0,"data": [
{
    "id": 14845,
    "title": "Текст новости",
    "teaser": "В этом году было выявлено 47 положительных проб.\r\n",
    "delay_date": "2018-12-11 03:03:00",
    "cat": {
        "category_id": 17,
        "language_id": "ru",
        "slug": "sport",
        "description": "",
        "title": "Новость",
    },

}
]

В консоле пишет Expected to decode Array but found a dictionary instead
Как я понял от меня ожидается массив
Как мне исправить это?


#2

вы не показали структуру News_data… не важно

ваш json имеет такую структуру

-- error
-- data
  -- news []

вы же пытаетесь достать данные из такой структуры

 -- error
 -- data []

#3

Прошу прощения
Я дополнил вопрос


#4

JSON точно верный? т.к. по ссылке мне выдает другой


#5

Да, я прост сократил его


#6

так не пойдет. мне нужно знать структуру исходного JSON’a


#7

ну это он и есть, перейдите по ссылке


#8

тогда повторяю свой ответ

ваш json имеет такую структуру

-- error
-- data
  -- news []

вы же пытаетесь достать данные из такой структуры

 -- error
 -- data []

#9

хммм, верно, спасибо