Swift解码双层嵌套JSON数组报Expected to decode Array错误如何解决
报错原因
- 你定义的Codable结构体结构与实际JSON结构不匹配:JSON根节点下的
itenaries字段是字典类型,而你在Itenaries结构体中将itenaries声明为[[Days]]数组类型,因此解码时抛出「期望解码Array但找到dictionary」的错误。 - 实际JSON层级为:根节点 →
itenaries字典对象 → 字典内的days字段才是双层嵌套数组,数组元素为行程项对象。
正确解码实现
修正后的Codable结构体
// 匹配JSON根节点结构 struct RootResponse: Codable { let itenaries: ItenariesInfo } // 匹配itenaries字典的结构 struct ItenariesInfo: Codable { let days: [[Days]] } // 原行程项模型无需修改 struct Days : Codable { let itenary_id : Int let itenary_location_name : String }
修正后的解码代码
let decoder = JSONDecoder() do { let result = try decoder.decode(RootResponse.self, from: fileData) // 按层级访问数据即可 print(result.itenaries.days[0][0].itenary_id) } catch { print("解码失败: \(error.localizedDescription)") }
可选优化
你可以开启JSONDecoder的下划线转驼峰策略,让属性命名更符合Swift规范,无需修改JSON对应键:
// 解码器配置 let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase // 对应修改模型属性命名 struct Days : Codable { let itenaryId: Int let itenaryLocationName: String }
内容的提问来源于stack exchange,提问作者Ikmal Azman
相关产品推荐
相关产品推荐

