如何使用解码器将给定 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】:

除了使用.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。)

【讨论】:

以上是关于如何使用解码器将给定 JSON 中 Double 类型的 Codable 属性转换为 Date?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 字符串解码为给定的 KClass?

在 Swift 中动态解码任意 json 字段

本文将向您展示如何在 Flutter 中编码/解码 JSON

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (ch

如何修复“JSONDecodeError:无法解码 JSON 对象:第 1 行第 0 列(字符 0)”?

如何将编码器作为参数传递给数据帧的 as 方法