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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:06:03