如何使用jsondecoder解码此json?我在努力,但我总是失败。我有另一篇文章在讨论这个问题,但之前的错误更大,现在我只是在这个问题上受挫。我也尝试过使用jsonserialization,但我认为使用jsondecoder更干净。
当编译器通过jsondecoder部分时,我收到了此错误消息:
无法获取API数据。类型不匹配(swift.array,swift.decodingerror.context(codingpath:[],debugdescription:“应解码数组,但找到字典。”,underlineingerror:nil)),无法读取数据,因为格式不正确。
这就是我试图分析所有数据的方式:

import Foundation

//typealias AudiobookJSON = [[String: Any]]

struct APIClient {

    static func getAudiobooksAPI(completion: @escaping ([Audiobook]?) -> Void) {

        let url = URL(string: "https://alodjinha.herokuapp.com/categoria")

        let session = URLSession.shared

        guard let unwrappedURL = url else { print("Error unwrapping URL"); return }

        let dataTask = session.dataTask(with: unwrappedURL) { (data, response, error) in

            guard let unwrappedDAta = data else { print("Error unwrapping data"); return }

            do {


                let posts = try JSONDecoder().decode([Audiobook].self, from: unwrappedDAta)

                print(posts)


                completion(nil)

            } catch {
                print("Could not get API data. \(error), \(error.localizedDescription)")
            }
        }
        dataTask.resume()
    }
}

我正在使用的结构:
import Foundation

struct Data : Decodable {

    let data : [Audiobook]
}

struct Audiobook: Decodable {
    let id : Int?
    let descricao : String?
    let urlImagem : String?

//    init(dictionary: Audiobook) {
//        self.descricao = dictionary["descricao"] as! String
//        self.urlImagem = dictionary["urlImagem"] as! String
//
//    }
}

要分析的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\u00e1tica",
      "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\u00e9stico",
      "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\u00e9ries",
      "urlImagem": "https:\/\/pbs.twimg.com\/profile_images\/801033586438733824\/91Y_N91t_reasonably_small.jpg"
    },
    {
      "id": 8,
      "descricao": "M\u00f3veis e Decora\u00e7\u00f5es",
      "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"
    }
  ]
}

最佳答案

当数据实际上是一个包装数组的字典时,您试图将其解码为[AudioBook],就像在Data结构中一样。把它改成:

let data = try JSONDecoder().decode(Data.self, from: unwrappedDAta)

你应该好好去。

07-27 19:21