我在解码下面的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
?
而不是使用 .formatted
dateDecodingStrategy
,你必须再深入一层,并使用 .custom
一个自己做解码,把它从一个 "小号 "转换成 "大号"。Int
到 String
手动。
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
.)