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



我在解码以下 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的属性,而不是使用DecoderInt它的属性?

而不是使用.formatteddateDecodingStrategy,您必须更深入一层并使用.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

相关内容

  • 没有找到相关文章

最新更新