Swift 4 JSON解析报错:期望解码数组却得到字典
解决Swift中JSON解析类型不匹配问题(数组 vs 字典)
你遇到的核心问题很明确:API返回的是单个字典格式({...}),但你的代码却在尝试把它解码成数组类型,这就触发了typeMismatch错误。下面是一步步的修复方案:
1. 先确认API返回的真实结构
首先得搞清楚API到底给你返回了什么,比如它实际是这样的单个字典:
{ "id": 1, "title": "Sample Data", "content": "This is a test response" }
而不是你代码预期的数组格式:
[ { "id": 1, "title": "Sample Data" } ]
2. 修正解码代码的类型
假设你之前写的是解码数组的代码,比如:
// ❌ 错误写法:试图解码成数组 let result = try JSONDecoder().decode([YourCustomModel].self, from: responseData)
你需要把它改成解码单个对象:
// ✅ 正确写法:解码单个字典对应的模型 let result = try JSONDecoder().decode(YourCustomModel.self, from: responseData)
如果还没定义对应的数据模型,你需要创建一个和API返回字典字段匹配的Decodable结构体:
struct YourCustomModel: Decodable { let id: Int let title: String let content: String? // 可选字段根据API实际返回设置 }
3. 调试时先打印原始JSON
要是不确定API返回的内容,建议先把获取到的Data转成字符串打印出来,直观确认结构:
if let jsonString = String(data: responseData, encoding: .utf8) { print("API返回的原始JSON:\n\(jsonString)") }
这能帮你快速排查是不是结构理解错了。
4. 处理嵌套字典的情况
如果API返回的是带外层包裹键的嵌套字典,比如:
{ "data": { "id": 1, "title": "Sample Data" } }
那你需要额外定义一个包裹模型:
struct ResponseWrapper: Decodable { let data: YourCustomModel } // 解码时先解析外层包裹,再取实际数据 let wrappedResult = try JSONDecoder().decode(ResponseWrapper.self, from: responseData) let actualData = wrappedResult.data
按照上面的步骤调整后,应该就能解决这个类型不匹配的解码错误了。
内容的提问来源于stack exchange,提问作者SSI_T
相关产品推荐
相关产品推荐

