微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JSON 解码 Swift 中的日期

如何解决JSON 解码 Swift 中的日期

我遇到了一个奇怪的问题。我可以在流行的在线 Swift 编译器中很好地运行代码,但在 Xcode 和我的 iOS 应用程序中,生成的结果是错误的!

import Foundation

extension DateFormatter {
    static let iso8601Full: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
        return formatter
    }()
}

struct MyObj: Decodable {
    var endTime: Date?
}

let jsonString = "{\"endTime\":\"2021-02-20T18:29:59.999Z\"}"
let jsonData: Data? = jsonString.data(using: .utf8)
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(DateFormatter.iso8601Full)
let obj = try decoder.decode(MyObj.self,from: jsonData!)
print(obj)

以上代码在在线 Swift 编译器上产生预期的输出(如下),例如 online.swiftplayground.run、tutorialspoint.com、jdoodle.com

MyObj(endTime: Optional(2021-02-20 18:29:59 +0000))

但是当相同的代码在 iOS 模拟器上的 Xcode 中执行时,产生的输出是这样的:

MyObj(endTime: nil)

这是来自我的 iOS 应用的确切代码

import Foundation

class RestClient {
  static let instance = RestClient()

  func get() {
      do {
        let jsonString = "{\"endTime\":\"2021-02-20T18:29:59.999Z\"}"
        let jsonData: Data? = jsonString.data(using: .utf8)
        let decoder = JSONDecoder()
        decoder.dateDecodingStrategy = .formatted(DateFormatter.iso8601Full)
        let obj = try decoder.decode(MyObj.self,from: jsonData!)
      } catch let error {
        print("JSON parsing error: \(error)")
      }
  }

  func jsonDecoder() -> JSONDecoder {
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .formatted(DateFormatter.iso8601Full)
    return decoder
  }
}

extension DateFormatter {
  static let iso8601Full: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    return formatter
  }()
}

struct MyObj: Decodable {
  var endTime: Date?
}

谁能帮帮我?我已验证 Xcode 和在线编译器的 Swift 版本均为 5。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?