You need to enable JavaScript to run this app. Swift中JSONDecoder如何解析键名含冒号的JSON数据
优惠活动
大模型
产品
解决方案
定价
更多

Swift中JSONDecoder如何解析键名含冒号的JSON数据

带冒号键名的JSON适配Swift JSONDecoder 的实现方案

核心结论

完全可以继续沿用JSONDecoder的解析逻辑,无需退回老旧的手动JSON字典解析方案,通过简单的键映射规则即可解决Swift保留字符带来的语法限制问题。

问题根源

冒号是Swift语法中的保留字符,无法直接作为结构体属性名的一部分使用:如果尝试直接书写var ua:item: [CityItem]这类属性,会直接触发编译期语法错误,无法匹配JSON中带冒号的ua:item键名。
而JSONDecoder的默认解析逻辑是靠“属性名与JSON键名一一对应”定位数据,这也是常规场景下触发适配问题的原因。

简单适配实现方法

最省事的做法是 自定义CodingKeys枚举完成键名映射,全程不需要改动原有JSONDecoder的调用流程,也不损失类型安全的优势:

  • 首先在模型中使用符合Swift语法规范的合法属性名,代替无法直接书写的带冒号键名
  • 定义和模型关联的CodingKeys枚举,将枚举成员的原始值设置为JSON中实际带冒号的键名,建立属性名和实际键名的映射关系

参考实现代码:

// 对应接口返回的整体数据模型
struct UrbanAreaResponse: Decodable {
    // 使用合法Swift属性名映射JSON中的"ua:item"键
    var urbanAreaItems: [CityItem]
    
    // 自定义键映射规则
    private enum CodingKeys: String, CodingKey {
        case urbanAreaItems = "ua:item"
        // 如有其他带冒号的JSON键,可在此处补充对应映射
    }
}

// "ua:item"数组内的单个城市数据模型
struct CityItem: Decodable {
    // 数组内字段无非法字符时,可直接用属性名自动匹配
    var name: String
    var detailLink: String
}

解码调用的代码和常规场景完全一致,无需额外适配:

let decoder = JSONDecoder()
let parsedResult = try decoder.decode(UrbanAreaResponse.self, from: responseData)
// 直接通过合法属性名访问解析后的数据即可
let cityList = parsedResult.urbanAreaItems

方案优势

这种实现方式完全保留了JSONDecoder简洁、类型安全、无手动强转风险的特性,开发成本极低,不需要放弃现有解码框架回到传统的字典遍历、类型强转的老旧解析逻辑。

内容的提问来源于stack exchange,提问作者Gallaugher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 03:45:01