【问题标题】:How to handle an empty date string in JSONDecoder如何处理 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 用于一致的数据。
  • 非常感谢。我会试试的。

标签: ios swift nsdateformatter jsondecoder


【解决方案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 块了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2016-04-09
    • 2021-11-01
    • 2022-12-19
    • 2018-07-09
    • 2019-01-10
    相关资源
    最近更新 更多