Swift解析以数组开头的JSON:如何定义初始结构体?
解决直接以数组开头的JSON解码问题
嘿,这个场景我太熟悉了!其实根本不需要额外定义带外层键的结构体——因为你的JSON本身就是一个数组,直接解码成[Item]类型的数组就行,完全适配你已经定义好的Item: Codable结构体。
具体做法:
- 直接使用
JSONDecoder解码为[Item].self,而不是自定义的外层结构体。
举个完整的代码例子:
// 你已经定义好的Item结构体 struct Item: Codable { let userId: Int let id: Int let title: String } // 解码逻辑 let jsonData = """ [{"userId":1,"id":1,"title":"TEST text"},{"userId":2,"id":2,"title":"Another test"}] """.data(using: .utf8)! do { let items = try JSONDecoder().decode([Item].self, from: jsonData) // 现在items就是包含所有Item实例的数组了 print(items) } catch { print("解码失败:\(error)") }
为什么不用外层结构体?
因为你的JSON根元素是数组,而Swift的Array本身就遵循Codable协议(只要数组里的元素遵循),所以直接解码成数组类型是最直接、最简洁的方案,完全没必要多套一层data键的结构体。
当然,如果出于某种需求(比如统一项目里的解码结构)一定要用结构体包裹,也可以这么定义,但其实有点画蛇添足:
struct ItemResponse: Codable { let items: [Item] } // 但这时候你需要修改JSON,给数组套上"items"键,显然不符合你的原始JSON结构,所以不推荐
总之,直接解码成[Item]就是最适配你当前JSON结构的解法~
内容的提问来源于stack exchange,提问作者Mike T
相关产品推荐
相关产品推荐

