如何处理 JSONDecoder 中的空日期字符串

Posted

技术标签:

【中文标题】如何处理 JSONDecoder 中的空日期字符串【英文标题】:How to handle an empty date string in JSONDecoder 【发布时间】:2018-08-19 15:19:34 【问题描述】:

我的 json 中的日期参数可以为空(“”)。 JSONDecoder中如何处理?

自定义的dateDecodingStrategy只能处理不同的格式,不能处理空值。(formatter返回的日期不能是可选的)。

当日期有一个值时,它将完美地工作。但是当日期为“”时,它会崩溃。

decoder.dateDecodingStrategy = .custom( (decoder) -> Date in
        let container = try decoder.singleValueContainer()
        let dateStr = try container.decode(String.self)

        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.dateFormat = "yyyy"
        if let date = formatter.date(from: dateStr) 
            return date
        
        formatter.dateFormat = "yyyy-MM-dd"
        if let date = formatter.date(from: dateStr) 
            return date
        
        throw DateError.invalidDate
    )

【问题讨论】:

如果字符串为空,您希望返回什么日期?顺便怪 web 服务的所有者发送一致的数据。 当字符串为空时,我希望返回 nil。我的结构中的日期参数是可选的(日期:日期?)。 然后您必须通过添加自定义初始化程序直接在结构中解码日期或将日期解码为String 并在结构中添加计算属性。 dateDecodingStrategy 用于一致的数据。 非常感谢。我会试试的。 【参考方案1】:

根据@vadian 的评论,假设您期望用户相关数据的出生日期 (dob) 可能已由某个用户声明,也可能未声明,我所做的如下

public init(from decoder: Decoder) throws 
    //init other properties...
    do 
        self.dob = try container.decode(Date.self, forKey: .dob)
     catch 
        self.dob = nil
    

但再次根据@vadian 的评论,如果在 JSON 响应中不返回 dob 会更好。这样你就不需要 do/catch 块了。

【讨论】:

以上是关于如何处理 JSONDecoder 中的空日期字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 JsonConvert.DeserializeObject 中的空值/空值

如何处理 DRF 中的空索引列表?

如何处理 ASP.NET SqlDataSource 中的空 CONTAINS() 查询参数?

如何处理参数化查询中的空用户输入?

如何处理来自存储在vue中的空数据

如何处理泛型函数中的空 Guid?