Swift无需添加顶层键解码JSON为[(Date,Double)]的实现方法
解决方案
你不需要再手动添加外层主键,只需要修改PrincipalTimeSeriesData的解码实现,直接读取顶层的日期键值对即可,无需再嵌套查找Time Series (Daily)键。原来的PrincipalTimeSeriesDaily结构体不需要做任何调整。
修改后的完整代码
首先确保你已经定义了对应格式的日期格式化器(如果已有可以跳过):
let dateFormatterPrin: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyyMMdd" formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(secondsFromGMT: 0) return formatter }()
核心解码逻辑调整:
struct PrincipalTimeSeriesData { var timeSeriesDaily: [(Date, Double)] } extension PrincipalTimeSeriesData: Decodable { init(from decoder: Decoder) throws { // 直接读取整个JSON顶层的字典结构,无需匹配外层键 let topContainer = try decoder.singleValueContainer() let dailyDict = try topContainer.decode([String: PrincipalTimeSeriesDaily].self) // 转换为目标类型,用compactMap避免非法日期导致崩溃,也可换回你原来的map强制解包写法 timeSeriesDaily = dailyDict.compactMap { dateStr, dailyData in guard let date = dateFormatterPrin.date(from: dateStr) else { return nil } return (date, dailyData.close) } } } // 以下结构体完全保留原有逻辑即可 struct PrincipalTimeSeriesDaily { let close: Double } extension PrincipalTimeSeriesDaily: Decodable { enum CodingKeys: String, CodingKey { case close = "NAV" } }
核心改动说明
- 删除了原有
CodingKeys枚举,不需要再匹配手动添加的外层Time Series (Daily)键 - 改用
singleValueContainer()直接读取整个JSON的顶层数据,对应去掉外层键后的原生JSON结构 - 可选优化:将原有强制解包替换为
compactMap+可选绑定,避免异常日期格式导致的崩溃,如果你确定所有日期格式完全合法,也可以保留原来的map+!写法。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

