Ошибка сериализации

Почему я не могу получить доступ ко всем свойствам внутри структуры «data» таким образом? В противном случае я не знаю, как разбирать все данные внутри массива «Data».

Вот как я пытаюсь сериализовать:

import Foundation
import Alamofire

struct Description: Decodable {
    let _data: [data]
}
struct data: Decodable {
    let id:Int?
    let descricao:String?
    let urlImagem:String?
}
func callApi() {

    guard let _url = URL(string: "https://alodjinha.herokuapp.com/categoria")else{return}
    Alamofire.request(_url).responseJSON { (response) in

        guard let _data = response.data else{return}
        //let dataString = String(data: _data, encoding: .utf8)

        do{
            let dataParsed = try JSONDecoder().decode([Description].self, from: _data)
                print(dataParsed.id)


        }catch{
            print("Error serialization")}



}
}

Я получаю сообщение об ошибке:

Сериализация ошибки: typeMismatch (Swift.Array ‹Any>, Swift.DecodingError.Context (codingPath: [], debugDescription: «Ожидается декодирование массива ‹Any>, но вместо этого найден словарь.», LowerError: nil))

Модель JSON, за которой я следую:

 {
    "data":[
        {
            "id":1,
            "descricao":"Games",
            "urlImagem":"http://39ahd9aq5l9101brf3b8dq58.wpengine.netdna-cdn.com/wp-content/uploads/2013/06/3D-Gaming.png"
        },
        {
            "id":2,
            "descricao":"Livros",
            "urlImagem":"http://4.bp.blogspot.com/-6Bta1H9d22g/UJAIJbqcHhI/AAAAAAAAKi4/hvgjWrlFc64/s1600/resenha-missiologia.png"
        },
        {
            "id":3,
            "descricao":"Celulares",
            "urlImagem":"http://pt.seaicons.com/wp-content/uploads/2015/11/Mobile-Smartphone-icon.png"
        },
        {
            "id":4,
            "descricao":"Informática",
            "urlImagem":"http://portal.ifrn.edu.br/campus/ceara-mirim/noticias/ifrn-oferece-curso-de-informatica-basica-para-pais-dos-estudantes/image_preview"
        },
        {
            "id":5,
            "descricao":"Eletrodoméstico",
            "urlImagem":"http://classificados.folharegiao.com.br/files/classificados_categoria/photo/8/sm_4d5ed3beb0f31b61cb9a01e46ecd0cf9.png"
        },
        {
            "id":6,
            "descricao":"TVs",
            "urlImagem":"http://i.utdstc.com/icons/256/terrarium-tv-android.png"
        },
        {
            "id":7,
            "descricao":"Filmes e Séries",
            "urlImagem":"https://pbs.twimg.com/profile_images/801033586438733824/91Y_N91t_reasonably_small.jpg"
        },
        {
            "id":8,
            "descricao":"Móveis e Decorações",
            "urlImagem":"https://image.flaticon.com/icons/png/128/148/148188.png"
        },
        {
            "id":9,
            "descricao":"Moda, Beleza e Perfumaria",
            "urlImagem":"http://icon-icons.com/icons2/196/PNG/128/fashion_23852.png"
        },
        {
            "id":10,
            "descricao":"Papelaria",
            "urlImagem":"http://esen.pt/in/images/stories/skills_256.png"
        }
    ]
}

person Bruno Vavretchek    schedule 25.05.2018    source источник
comment
Какая именно у вас проблема? Получаете ли вы какие-либо ошибки, предупреждения или другие сообщения? Поместите их в свой вопрос.   -  person rmaddy    schedule 26.05.2018
comment
Привет! Что ж, после того, как я проанализирую с помощью JsonDecoder, я хочу сказать что-то вроде: dataParsed.id, а также dataParsed.descricao и получить доступ ко всем свойствам.   -  person Bruno Vavretchek    schedule 26.05.2018
comment
У вас есть массив data. Вам необходимо выполнить итерацию по массиву или получить доступ к определенному объекту в массиве. Тогда вы можете получить id каждого.   -  person rmaddy    schedule 26.05.2018
comment
Не могли бы вы привести мне пример с использованием части кода?   -  person Bruno Vavretchek    schedule 26.05.2018


Ответы (1)


Во-первых, ошибка указывает на то, что у вас есть только один Description в JSON, но ваш код пытается получить массив.

Вам нужно изменить:

let dataParsed = try JSONDecoder().decode([Description].self, from: _data)

to:

let dataParsed = try JSONDecoder().decode(Description.self, from: _data)

Теперь вам нужно перебрать массив data.

Это означает, что вам нужен код, похожий на:

for aData in dataParsed._data {
    print(aData.id)
}

К вашему сведению - имена классов, структур и перечислений должны начинаться с заглавных букв. Имена функций, переменных и регистров должны начинаться со строчных букв.

Также избегайте использования _ в именах переменных.

person rmaddy    schedule 25.05.2018
comment
Еще один вопрос. Как вы думаете, то, как я все это делаю, это лучший способ получить данные и сериализовать их? - person Bruno Vavretchek; 26.05.2018