首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能用JSONDecoder解码

不能用JSONDecoder解码
EN

Stack Overflow用户
提问于 2018-05-30 02:56:38
回答 1查看 5.6K关注 0票数 1

如何使用JSONDecoder解码这个JSON?我在努力,但我总是以崩溃告终。我有另一个帖子谈论它,但错误是更大的以前,现在我只被塞在这上面。我也尝试过使用JSONSerialization,但我认为使用JSONDecoder更干净。

当编译器经过JSONDecoder部件时,我收到了以下错误消息:

无法获取API数据。typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[],debugDescription:“期望解码数组,但找到了字典”,underlyingError: 0)),无法读取数据,因为它的格式不正确。

这就是我试图解析所有数据的方式:

代码语言:javascript
复制
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()
    }
}

我正在使用的结构:

代码语言:javascript
复制
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:

代码语言:javascript
复制
{
  "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"
    }
  ]
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-30 03:09:17

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

代码语言:javascript
复制
let data = try JSONDecoder().decode(Data.self, from: unwrappedDAta)

你应该可以走了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50595745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档