Swift's JSONDecoder提供了dateDecodingStrategy属性,它允许我们定义如何根据DateFormatter对象解释传入的日期字符串.

然而,我目前正在使用一个API,它根据属性返回日期字符串(yyyy-MM-dd)和日期时间字符串(yyyy-MM-dd HH:mm:ss).由于提供的DateFormatter对象一次只能处理一个dateFormat,有没有办法让JSONDecoder处理这个问题?

一个笨拙的解决方案是重写附带的Decodable个模型,只接受字符串作为它们的属性,并提供公共Date getter/setter变量,但对我来说,这似乎是一个糟糕的解决方案.有什么 idea 吗?

推荐答案

有几种方法可以解决这个问题:

  • 您可以创建一个DateFormatter子类,它首先try 日期时间字符串格式,如果失败,则try 普通日期格式
  • 您可以给出一个.customDate解码策略,其中您向Decoder请求一个singleValueContainer(),解码一个字符串,并在传递解析的日期之前将其传递给您想要的任何格式化程序
  • 您可以围绕Date类型创建一个包装器,它提供了一个定制的init(from:)encode(to:)(但这实际上并不比.custom策略更好)
  • 正如你所建议的,你可以使用普通字符串
  • 你可以在使用这些日期的所有类型上提供一个自定义的init(from:),并在其中try 不同的事情

总而言之,前两种方法可能是最简单、最干净的——在不牺牲类型安全性的情况下,您将在所有地方保留默认的合成实现Codable.

Swift相关问答推荐

AirPods手势不发送AVAudioApp静音状态通知

日期格式yyyyyy—MM—dd hh:mm:ss +0000到dd MMM,以swift格式表示""""

当我点击模拟器中的文本字段时,UIKit CLLocationButton崩溃

像WebSocket一样接收实时更新,但通过异步/等待或组合

SWIFT异步/等待,多个监听程序

SwiftUI 组合问题:通过 AppEventsManager 在 ViewModel 之间共享数据

ClosedRange.Swift 中 Int 的索引?

避免 `(())` 显式指定 Void 类型的枚举关联值

允许为 self 分配新的 struct 值的理由是什么?

自定义碰撞形状出现在错误的位置

如何修改下面的代码,使图像 Select 的顺序与使用快速并发的图像呈现的顺序相匹配?

在 Vapor 4 中使用协议的通用流利查询

为什么 performSegue() 不调用 shouldPerformSegue()

如何自己快速编写 Hashable 协议

否定 #available 语句

即使设置为从不也可以访问 iOS11 照片库

在 Swift 中指定 UITextField 的边框半径

Swift 的 JSONDecoder 在 JSON 字符串中有多种日期格式?

如何在 Swift 中重写 setter

iOS:如何检测用户是否订阅了自动更新订阅