Swift JSON解码错误:期望解码字典却发现数组问题求助
解决Swift Codable解码时"Expected to decode Dictionary but found an array instead."错误
嘿,这个错误我太熟悉了!你遇到的Expected to decode Dictionary but found an array instead.问题,本质就是你的Codable模型结构和JSON的实际结构不匹配——大概率是你把events字段的类型写错了,或者外层的模型定义错了。
先看看你提供的JSON结构:外层是一个包含pagination字典和events数组的对象,而events里的每个元素又是一个包含name(嵌套字典)等字段的对象。我们需要严格按照这个结构来定义Codable模型。
第一步:定义匹配JSON的Codable模型
根据你的JSON片段,我帮你写好对应的模型结构:
// 对应events里每个元素的name字段(嵌套结构) struct EventName: Codable { let text: String let html: String } // 单个事件的模型,包含你需要的name和description(假设description结构和name一致,可根据实际JSON调整) struct Event: Codable { let name: EventName let description: EventName? // 用可选类型处理可能缺失的字段 } // 最外层的响应模型,包含pagination和events数组 struct EventResponse: Codable { let pagination: Pagination let events: [Event] // 重点!这里必须是数组类型,不能是字典 } // 可选:如果你需要用到pagination的内容,也可以定义对应的模型 struct Pagination: Codable { let pageNumber: Int let pageSize: Int let continuation: String let hasMoreItems: Bool // 处理JSON里的蛇形命名和Swift驼峰命名的转换 enum CodingKeys: String, CodingKey { case pageNumber = "page_number" case pageSize = "page_size" case continuation case hasMoreItems = "has_more_items" } }
第二步:正确解码JSON数据
接下来用JSONDecoder解码数据,注意可以设置命名转换策略来简化模型定义:
// 假设你已经获取到了JSON数据(比如从网络请求返回的data) do { let decoder = JSONDecoder() // 自动将JSON的蛇形命名转换为Swift的驼峰命名,这样Pagination模型可以不用写CodingKeys decoder.keyDecodingStrategy = .convertFromSnakeCase let eventResponse = try decoder.decode(EventResponse.self, from: data) // 现在可以遍历events数组,获取你需要的name和description了 for event in eventResponse.events { print("事件名称:\(event.name.text)") if let desc = event.description { print("事件描述:\(desc.text)") } } } catch { print("解码失败:\(error.localizedDescription)") print("详细错误信息:\(error)") // 这里可以看到更具体的不匹配位置 }
错误原因分析
你之前的代码之所以报错,大概率是以下两种情况之一:
- 把
events的类型定义成了字典:比如在响应模型里写了let events: [String: Event],但JSON里events是数组,解码器期望字典却拿到数组,就会抛出这个错误。 - 直接解码成了数组而不是外层对象:比如你尝试
decoder.decode([Event].self, from: data),但整个JSON外层是一个包含pagination和events的字典,解码器期望数组却拿到字典,也会报错。
小提示
- 如果
description字段在JSON里是普通字符串而不是嵌套字典,直接把模型里的description类型改成String?即可。 - 对于可能缺失的字段,尽量用可选类型(
?),避免解码失败。
内容的提问来源于stack exchange,提问作者Coding while Loading
相关产品推荐
相关产品推荐

