Decodable与对象类型不匹配:服务器JSON数据解析问题
解决Decodable解析JSON对象数组不匹配的问题
我来帮你搞定这个Decodable解析的问题,这是Swift里很常见的模型结构不匹配导致的错误,咱们一步步来解决:
第一步:按JSON结构正确定义Decodable模型
你的JSON最外层是一个包含items数组的对象,不是直接的数组,所以必须从根节点开始定义模型,不能直接解析成[Item]。以下是完全匹配你给出的JSON结构的代码:
// 根模型:对应整个JSON的最外层结构 struct RootResponse: Decodable { let items: [Item] } // 对应items数组里的每一个元素对象 struct Item: Decodable { let itemType: ItemType let parts: [Part] let description: String } // 嵌套的itemType子对象 struct ItemType: Decodable { let id: Int let tagId: String } // 嵌套的parts数组里的子元素 struct Part: Decodable { let partId: Int let manufacturer: String }
第二步:排查常见的错误原因
你遇到的类型不匹配错误,大概率是以下情况之一:
- 跳过了根模型,直接尝试解析
[Item].self(但JSON最外层是带items字段的对象,不是纯数组) - 嵌套模型的属性类型定义错误:比如把
id写成String(JSON里是数字类型),或者把tagId写成Int(JSON里是字符串) - 属性名和JSON字段不匹配:比如把
itemType写成item_type却没设置解码策略
第三步:正确的解析代码示例
用JSONDecoder解析服务器返回的Data数据:
// 假设data是你从服务器获取到的Data对象 do { let decoder = JSONDecoder() // 如果你的JSON字段是下划线命名(比如item_type),可以开启下面的策略,你的示例不需要 // decoder.keyDecodingStrategy = .convertFromSnakeCase let response = try decoder.decode(RootResponse.self, from: data) // 解析成功后就能使用response.items数组了 print("解析成功,共\(response.items.count)个条目") } catch { // 打印详细错误信息,精准定位问题 print("解析失败:\(error.localizedDescription)") print("错误详情:\(error)") }
如果还是有问题,把打印出来的详细错误信息贴出来,就能快速找到哪个字段或类型不匹配了。
内容的提问来源于stack exchange,提问作者mikro098
相关产品推荐
相关产品推荐

