You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)") // 这里可以看到更具体的不匹配位置
}

错误原因分析

你之前的代码之所以报错,大概率是以下两种情况之一:

  1. 把events的类型定义成了字典:比如在响应模型里写了let events: [String: Event],但JSON里events是数组,解码器期望字典却拿到数组,就会抛出这个错误。
  2. 直接解码成了数组而不是外层对象:比如你尝试decoder.decode([Event].self, from: data),但整个JSON外层是一个包含pagination和events的字典,解码器期望数组却拿到字典,也会报错。

小提示

  • 如果description字段在JSON里是普通字符串而不是嵌套字典,直接把模型里的description类型改成String?即可。
  • 对于可能缺失的字段,尽量用可选类型(?),避免解码失败。

内容的提问来源于stack exchange,提问作者Coding while Loading

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:13:15