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

问题描述 投票:0回答:1

我在解码下面的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 (我想是的...)。

它说:

预计要解码字符串,但发现了一个数字。

那么,我怎样才能将一个 Codable的属性,其类型为 Date 在一个给定的JSON中,它的属性是 Int 而不是使用 Decoder?

json swift codable dateformatter
1个回答
2
投票

而不是使用 .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.)

© www.soinside.com 2019 - 2024. All rights reserved.