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

Swift4中JSON日期解码失败问题求助

解决Swift JSON解码中Date类型不匹配的问题

嗨,别慌!这个问题我刚学Swift的时候也踩过一模一样的坑~咱们来一步步拆解:

为什么会报错?

默认情况下,JSONDecoder对Date类型的解码规则是解析成时间戳(也就是Double类型的数字),但你的JSON返回的是"yyyy-MM-dd"格式的字符串日期,这就导致解码器一脸懵:“我要找Double,怎么来了个字符串?”于是就抛出了你看到的typeMismatch错误。

怎么解决?

核心思路就是告诉JSONDecoder:“别找时间戳了,按我指定的字符串格式来解析日期!”具体分两步:

  1. 创建一个DateFormatter,设置和JSON日期完全匹配的格式;
  2. 把这个格式化器赋值给JSONDecoder的dateDecodingStrategy属性。

修改后的完整代码

struct EventDetail: Decodable {
    let EventName: String
    let EventInformation: String
    let EventStartDate: Date
    let EventEndDate: Date
    
    // 可以把日期格式化器抽成静态属性,避免重复创建,提升性能
    static let dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        // 如果你的JSON日期包含时区,这里可以额外设置timeZone,比如formatter.timeZone = TimeZone(identifier: "UTC")
        return formatter
    }()
}

func downloadJSON(completed: @escaping () -> ()) {
    // 这里用guard替代强制解包,更安全
    guard let url = URL(string: "http://someurl.php") else {
        print("无效的URL")
        return
    }
    
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        // 先处理错误和空数据的情况
        if let error = error {
            print("请求出错:\(error)")
            return
        }
        
        guard let data = data else {
            print("未获取到数据")
            return
        }
        
        do {
            let decoder = JSONDecoder()
            // 设置日期解码策略为我们定义的格式化器
            decoder.dateDecodingStrategy = .formatted(EventDetail.dateFormatter)
            
            self.events = try decoder.decode([EventDetail].self, from: data)
            DispatchQueue.main.async {
                completed()
            }
        } catch {
            print("JSON解码错误:\(error)")
        }
    }.resume()
}

额外小贴士

  • 日期格式要完全匹配:如果后续JSON的日期格式变了(比如加了时间yyyy-MM-dd HH:mm:ss),一定要同步修改dateFormat,不然又会报错;
  • 排序更方便了:现在EventStartDate和EventEndDate都是Date类型,直接用比较运算符就能排序,比如:
    let sortedEvents = events.sorted { $0.EventStartDate < $1.EventStartDate }
    
    是不是比用字符串排序靠谱多了?

内容的提问来源于stack exchange,提问作者Jørgen Lindalen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:59:54