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

出现‘预期解码Dictionary<String, Any>却得数组’错误,如何用Codable解析给定JSON数组?

解决Codable解析JSON数组时的类型不匹配错误

问题根源

你收到的错误Expected to decode Dictionary<String, Any> but found an array instead,本质是解析目标类型和JSON结构不匹配:你的JSON最外层是数组(用[]包裹的多个对象),但你大概率是尝试解析成了单个Question结构体(对应JSON里的单个字典{}),自然就会报错。

第一步:定义对应单个JSON对象的Codable结构体

首先我们要描述JSON里单个对象的结构,注意处理JSON里的下划线命名(created_at)和Swift驼峰命名的映射:

import Foundation

struct Question: Codable {
    let question: String
    let id: String
    let createdAt: Date? // 因为JSON里是null,所以用可选类型
    
    // 手动映射JSON键和Swift属性名
    enum CodingKeys: String, CodingKey {
        case question, id
        case createdAt = "created_at"
    }
}

如果你的业务里不需要处理created_at字段,也可以直接在CodingKeys里不包含它,解析时会自动忽略这个字段。

第二步:解析成数组类型

接下来解析的时候,要明确告诉JSONDecoder我们要解析的是**Question类型的数组**,而不是单个Question:

// 假设你已经把JSON转换成了Data类型的jsonData
do {
    let questionsArray = try JSONDecoder().decode([Question].self, from: jsonData)
    // 解析成功,遍历数组处理数据
    for question in questionsArray {
        print("问题ID:\(question.id),内容:\(question.question)")
    }
} catch {
    print("解析失败:\(error.localizedDescription)")
}

额外提示

你的JSON里每个对象最后都多了一个逗号(比如"created_at": null,),虽然部分JSON解析器会容忍这种格式,但严格来说这是不规范的,建议修正JSON,去掉每个对象最后一个键值对后面的逗号,避免后续其他场景下的解析问题。

内容的提问来源于stack exchange,提问作者Dishant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:49:42