【问题标题】:Decoding error: “Expected to decode Dictionary<String, Any> but found an array instead.”解码错误:“应解码 Dictionary<String, Any>,但找到了一个数组。”
【发布时间】: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

标签: json swift4


【解决方案1】:

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

改用这个结构:

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

另外,这样捕获错误:

catch {
    print(error)
}

【讨论】:

  • 如果您不需要该数据,则结构中不需要 id 属性。
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 2018-10-30
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多