【发布时间】:2022-01-01 15:41:05
【问题描述】:
我有一个如下所示的 JSON 结构:
{
"start_date": "2021-12-31",
"created_at": "2021-12-30T23:36:25-06:00"
}
这两个值(start_date、created_at)具有不同的日期格式,但需要在彼此相同的级别上进行解析。我的 swift 结构看起来像:
struct ExampleDateFormatProblem: Codable {
var startDate: Date
var createdAt: Date
enum CodingKeys: String, CodingKey {
case startDate = "start_date"
case createdAt = "created_at"
}
}
并且正在使用
进行解码let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'.'SSS'Z'"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dateFormatter)
decoder.decode // (basic decoding stuff here, just showing the date formatting)
这个结构可以在没有start_date 格式的情况下完美解码,但是当将它添加回来时,它会中断,因为它与我设置 JSONDecoder 的日期格式不同。
所以这是我的问题,如何定义日期格式以用于结构中的 one 属性?在这个例子中,我需要说“start_date 应该使用这种格式解码,而 created_at 应该使用另一种格式”。这甚至可以使用 Swift 的 Codable 实现吗?
【问题讨论】:
-
您是否考虑过
.custom日期解码策略,或者为您的结构覆盖init(from:)? -
这肯定会有所帮助???????????? medium.com/@pxpgraphics/…
-
我真的不想使用自定义初始化程序,因为它会增加太多开销。 .custom 日期解码策略将应用于 整个 JSON 文档。我已经有了文档的日期格式,我只需要使用新格式解码一个值。
-
@thecoolwinter FWIW,您当前的
dateDecodingStrategy已经适用于整个 JSON 文档。使用.custom策略,你可以查看解码器的.codingPath来查看路径中的最后一个key:如果等于ExampleDateFormatProblem.CodingKeys.startDate,你可以使用一种格式;如果没有,您可以退回到现有的dateFormatter -
如果您不想自定义解码整个 json,那么您可以创建自己的具有自定义解码器 init 的日期包装器类型。然后,您可以将解码策略嵌入其中,而不必担心 json 的其余部分。如果您需要,稍后将其转换为另一种类型。
标签: json swift date-formatting codable