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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:29:18