如何使用解码器将给定 JSON 中 Double 类型的 Codable 属性转换为 Date?
Posted
技术标签:
【中文标题】如何使用解码器将给定 JSON 中 Double 类型的 Codable 属性转换为 Date?【英文标题】:How can I convert a Codable's property with type Double in a given JSON as Date using Decoder? 【发布时间】:2020-05-11 15:47:40 【问题描述】:我在解码以下 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 中转换 Codable
类型为 Date
的属性,它的属性是 Int
而不是使用 Decoder
?
【问题讨论】:
与您的问题无关,但您应该在设置格式化程序的 dateFormat 之前将您的 DateFormatter 语言环境设置为“en_US_POSIX”和日历 【参考方案1】:除了使用.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 中 Double 类型的 Codable 属性转换为 Date?的主要内容,如果未能解决你的问题,请参考以下文章
本文将向您展示如何在 Flutter 中编码/解码 JSON
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (ch