在 Swift 中解码具有不同 JSON 格式的日期值?

Decoding Date values with different JSON formats in Swift?

假设我们有以下结构:

struct TestCod: Codable {
    var txt = ""
    var date = Date()
}

如果我们期望 JSON 有两种相似的格式,我们如何处理解码?

JSON答:

{
"txt":"stack",
"date":589331953.61679399
}

JSON乙:

{
"txt":"overflow",
"date":"2019-09-05"
}

如可能重复所示post 我已经在评论中提到,您需要创建自定义日期解码策略:

首先创建用于解析日期字符串的日期格式化程序(请注意,这假定您的日期是当地时间,如果您需要 UTC 时间或服务器时间,则需要相应地设置格式化程序时区 属性):

extension Formatter {
    static let yyyyMMdd: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()
}

然后创建自定义解码策略以尝试您可能需要的所有可能的日期解码策略:

extension JSONDecoder.DateDecodingStrategy {
    static let deferredORyyyyMMdd  = custom {
        let container = try [=11=].singleValueContainer()
        do {
            return try Date(timeIntervalSinceReferenceDate: container.decode(Double.self))
        } catch {
            let string = try container.decode(String.self)
            if let date = Formatter.yyyyMMdd.date(from: string)  {
                return date
            }
            throw DecodingError.dataCorruptedError(in: container, debugDescription: "Invalid date: \(string)")
        }
    }
}

游乐场测试:

struct TestCod: Codable {
    let txt: String
    let date: Date
}

let jsonA = """
{
"txt":"stack",
"date":589331953.61679399
}
"""
let jsonB = """
{
"txt":"overflow",
"date":"2019-09-05"
}
"""

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .deferredORyyyyMMdd
let decodedJSONA = try! decoder.decode(TestCod.self, from: Data(jsonA.utf8))
decodedJSONA.date  //  "Sep 4, 2019 at 8:19 PM"
let decodedJSONB = try! decoder.decode(TestCod.self, from: Data(jsonB.utf8))
decodedJSONB.date  //  "Sep 5, 2019 at 12:00 AM"