Swift中如何解码Pascal Case格式的API密钥?
解决Swift Codable首字母大写属性的解码问题
当结构体属性采用首字母大写格式(如TheNumber)时,默认的JSONDecoder无法自动匹配JSON中的键(即使手动调整键的大小写也无效),核心原因是Codable默认采用严格的大小写匹配策略,只有属性名和JSON键名完全一致时才能成功解码。
解决方案1:手动指定CodingKeys映射
最直接的方式是通过CodingKeys枚举显式关联属性名与JSON键名:
struct TheData: Codable { let TheNumber: Float // 明确指定JSON键与属性的映射关系 enum CodingKeys: String, CodingKey { case TheNumber = "theNumber" // 字符串值对应JSON中的实际键名 } }
如果你的JSON键本身就是首字母大写的"TheNumber",只需将枚举值的rawValue改为"TheNumber"即可。
解决方案2:自定义KeyDecodingStrategy批量处理
如果存在大量首字母大写的属性,手动编写CodingKeys效率低下,可以自定义解码策略自动完成大小写转换:
let decoder = JSONDecoder() decoder.keyDecodingStrategy = .custom { codingKeys in let originalKey = codingKeys.last!.stringValue guard let firstCharacter = originalKey.first else { return codingKeys.last! } // 将JSON键的首字母转为大写,匹配结构体的首字母大写属性 let modifiedKey = String(firstCharacter).uppercased() + originalKey.dropFirst() return AnyCodingKey(stringValue: modifiedKey)! } // 辅助类:实现CodingKey协议,支持自定义键转换 private struct AnyCodingKey: CodingKey { var stringValue: String var intValue: Int? init?(stringValue: String) { self.stringValue = stringValue self.intValue = nil } init?(intValue: Int) { self.stringValue = String(intValue) self.intValue = intValue } }
如果你的JSON键是首字母大写、属性是小驼峰格式,只需把代码中的uppercased()替换为lowercased()即可。
注意事项
- Swift允许常量首字母大写,但Codable不会自动处理大小写差异,必须显式指定映射规则或转换策略。
- 确保JSON键名与你设置的映射/转换规则完全匹配,比如JSON键是
"TheNumber"就对应属性TheNumber,或通过策略自动转换为对应格式。
内容的提问来源于stack exchange,提问作者Viaxeen
相关产品推荐
相关产品推荐

