Swift4中JSON日期解码失败问题求助
解决Swift JSON解码中Date类型不匹配的问题
嗨,别慌!这个问题我刚学Swift的时候也踩过一模一样的坑~咱们来一步步拆解:
为什么会报错?
默认情况下,JSONDecoder对Date类型的解码规则是解析成时间戳(也就是Double类型的数字),但你的JSON返回的是"yyyy-MM-dd"格式的字符串日期,这就导致解码器一脸懵:“我要找Double,怎么来了个字符串?”于是就抛出了你看到的typeMismatch错误。
怎么解决?
核心思路就是告诉JSONDecoder:“别找时间戳了,按我指定的字符串格式来解析日期!”具体分两步:
- 创建一个
DateFormatter,设置和JSON日期完全匹配的格式; - 把这个格式化器赋值给
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
相关产品推荐
相关产品推荐

