如何使用解码器将给定 JSON 中类型为 Double 的 Codable 的 属性 转换为 Date?

How can I convert a Codable's property with type Double in a given JSON as Date using Decoder?

我在解码以下内容时遇到问题 JSON:

{
    ...

    "date": 20200202000000,

    ...
}

我知道格式是这样的yyyyMMddhhmmss

我的 Codable 结构是这样的:

struct MyCodableStruct: Codable{

    let date: Date

}

我想创建一个这样的 DateFormatter:

static let customFormater: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyyMMddHHmmss"
    formatter.calendar = Calendar(identifier: .iso8601)
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    return formatter
}()

所以我可以像这样轻松设置 JSONDecoder

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(customFormater)

但是你可能很明显这不起作用,因为它应该定义为 String 但现在它是 Int(我想是这样......)。

它说:

Expected to decode String but found a number instead.

那么,如何在给定的 JSON 中将类型为 DateCodable 的 属性 转换为 属性 21=] 而不是使用 Decoder?

而不是使用 .formatted dateDecodingStrategy,您必须更深入地使用 .custom 自己进行解码,将其从 IntString 手动:

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .custom({ decoder in
    let container = try decoder.singleValueContainer()
    let dateAsInteger = try container.decode(Int.self)
    let dateAsString = "\(dateAsInteger)"
    guard let date = WhateverTypeContainsCustomFormatter.customFormatter.date(from: dateAsString) else {
        throw DecodingError.dataCorruptedError(in: container, debugDescription: "Could not form Date from value: \(dateAsString)")
    }

    return date
})

(将 WhateverTypeContainsCustomFormatter 替换为...好吧,包含您的 customFormatter 的任何类型。)