解码错误:“应解码 Dictionary<String, Any>,但找到了一个数组。”

Posted

技术标签:

【中文标题】解码错误:“应解码 Dictionary<String, Any>,但找到了一个数组。”【英文标题】:Decoding error: “Expected to decode Dictionary<String, Any> but found an array instead.” 【发布时间】:2018-12-17 19:14:03 【问题描述】:

JSON 解码有问题。我为这个问题添加了其他答案,我也做了同样的事情,但我仍然得到错误。我做错了什么?

URLSession.shared.dataTask(with: r)  (data, response, error) in
    do 
        guard let data = data else  return 
        let banners = try JSONDecoder().decode([Banner].self, from: data)
        print(banners)
     catch let error as NSError 
            print(error)
        
    
.resume()

struct Banner: Decodable 
    var title: String
    var desc: String
    var image: String

JSON响应:

[
     
    "id": "b4a95512-8de2-4621-8956-3289e991fb0b",
    "image": "https://picsum.photos/500/324/"
    ,
  
   "id": "4e1c703d-4841-469b-be2e-8f15d6cbd0c3",
   "title": "Lays",
   "image": "https://picsum.photos/500/324/"
  ,
  
   "id": "4315705e-e6fc-4dfa-a52e-c9de2031ed53",
   "desc": "ФРУТОНЯНЯ Для детского питания с яблоком, для малышей от 0 до 3 лет",
   "image": "https://picsum.photos/500/324/"
  ,
  
   "id": "0b8e40ae-5e13-4bdd-905d-a13ffdd94b65",
   "title": "Бульмени",
   "desc": "ГОРЯЧАЯ ШТУЧКА Со сливочным маслом",
   "image": "https://picsum.photos/500/324/"
  
]

【问题讨论】:

此 JSON 和代码不会导致此错误。你应该得到一个keyNotFound 错误。并删除let error as NSError。解码错误永远不会是NSError 【参考方案1】:

您的结构中缺少"id" 键。 desctitle 没有为 json 响应中的所有元素提供,因此它们应该是可选的。

改用这个结构:

struct Banner: Codable 
    let id: String
    let image: String
    let title, desc: String?

另外,这样捕获错误:

catch 
    print(error)

【讨论】:

如果您不需要该数据,则结构中不需要 id 属性。

以上是关于解码错误:“应解码 Dictionary<String, Any>,但找到了一个数组。”的主要内容,如果未能解决你的问题,请参考以下文章

Python JSON to CSV - 编码错误,UnicodeDecodeError:'charmap'编解码器无法解码字节

解码错误:typeMismatch“预期解码 Array<Any> 但找到了字典。”

解码错误:“应解码 Dictionary<String, Any>,但找到了一个数组。”

一个低级错误引发Netty编码解码中文异常

错误UnicodeDecodeError:'utf-8'编解码器无法解码位置0的字节0xff:无效的起始字节

创建 smtp() 时出现 Python smtplib 错误:“utf-8”编解码器无法解码字节