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

Swift中如何将JSON的Item字段解码至重命名后的Codable结构体属性?

解决Codable结构体命名冲突与JSON字段映射问题

完全可以通过Codable的CodingKeys枚举实现JSON字段与自定义命名结构体的映射,完美解决已有Item结构体导致的重声明问题。

具体实现方案

  1. 重命名自定义结构体:把原Item结构体改名为Product(或其他你需要的名称),避免和已有结构体冲突:
struct Product: Codable {
    let id: Int
}
  1. 自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:29:55