出现‘预期解码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
相关产品推荐
相关产品推荐

