Swift中如何将JSON的Item字段解码至重命名后的Codable结构体属性?
解决Codable结构体命名冲突与JSON字段映射问题
完全可以通过Codable的CodingKeys枚举实现JSON字段与自定义命名结构体的映射,完美解决已有Item结构体导致的重声明问题。
具体实现方案
- 重命名自定义结构体:把原
Item结构体改名为Product(或其他你需要的名称),避免和已有结构体冲突:
struct Product: Codable { let id: Int }
- 自定义CodingKeys映射JSON字段:在
Order结构体中,通过CodingKeys枚举指定JSON里的"items"字段对应到结构体的products属性:
struct Order: Codable { let products: [Product] enum CodingKeys: String, CodingKey { // 映射JSON的"items"字段到当前结构体的products属性 case products = "items" } }
可选简化方案
如果不想修改Order里的属性名,依旧保留items作为属性名,只需将属性类型改为[Product]即可(此时属性名与JSON字段名一致,无需额外定义CodingKeys):
struct Order: Codable { // 属性名和JSON字段名一致,直接匹配 let items: [Product] } struct Product: Codable { let id: Int }
解码验证示例
用测试JSON数据验证解码逻辑:
let jsonData = """ { "items": [ { "id": 12345 }, { "id": 67890 }, { "id": 10111 }, { "id": 21314 } ] } """.data(using: .utf8)! do { let order = try JSONDecoder().decode(Order.self, from: jsonData) print(order.products.map { $0.id }) // 输出:[12345, 67890, 10111, 21314] } catch { print("解码错误:\(error)") }
原理说明
Codable协议默认通过属性名与JSON字段名的大小写匹配完成解码,当需要自定义映射关系时,CodingKeys枚举允许我们显式指定每个属性对应的JSON字段名,从而完全解耦结构体命名与JSON字段命名,同时避开已有代码的命名冲突。
内容的提问来源于stack exchange,提问作者brandontod97
相关产品推荐
相关产品推荐

