如何使用解码器将给定 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 中将类型为 Date
的 Codable
的 属性 转换为 属性 21=] 而不是使用 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
的任何类型。)
我在解码以下内容时遇到问题 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 中将类型为 Date
的 Codable
的 属性 转换为 属性 21=] 而不是使用 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
的任何类型。)