我在解码以下 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
(我想是这样..(。
它说:
预期解码字符串,但找到了一个数字。
那么,如何在给定的 JSON 中转换具有Date
类型的Codable
的属性,而不是使用Decoder
来Int
它的属性?
而不是使用.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
。