json - 日期字符串与格式化程序预期的格式不匹配

标签 json swift date jsondecoder dateformatter

只能在 friend 的设备上重现此问题。该设备来自德国,并在“设置”中设置为德国地区。我无法在任何加拿大设备上复制。为什么尝试从 JSON 创建 Date 属性时会失败?

控制台:

dataCorrupted(Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "60", intValue: nil), CodingKeys(stringValue: "expiration", intValue: nil)], debugDescription: "Date string does not match format expected by formatter.", underlyingError: nil))

结构:

struct TokenResponse: Decodable {
    var ticket : String
    var expiration : Date?
    var sessionId: String
}

在 URLSession 内部:

do {
    let decoder = JSONDecoder()
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    decoder.dateDecodingStrategy = .formatted(formatter)
    let json = try decoder.decode([String: TokenResponse].self, from: data)
}
catch {
    print(error)
}

JSON:

{
   "60":{
      "ticket":"aVeryLongJWT",
      "expiration":"2022-02-04T22:00:34.8325102Z",
      "sessionId":"aUUID"
   }
}

最佳答案

您应该在设置 dateFormat 字符串之前设置 locale:

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

参见DateFormatter中的“使用固定格式的日期表示”documentation .

关于json - 日期字符串与格式化程序预期的格式不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70993563/

相关文章:

android - GET 请求中 JSON 参数的长度限制

php - 解析巨大的GeoJSON文件并获取特定属性的多边形坐标

ios - 检查来自 Alamofire 和 Swift 的多个异步响应

ios - UIProgressView 动画只能正常工作一次

json - 对成员 'dataTask(with:completionHandler:)' 错误的引用不明确

java - Android 中简单 JSON 解析的输出问题

swift - Swift3 中的 Curried 闭包?

sql - postgresql - 将字符串转换为时间

android - 在 Android 中的特定日期创建日历事件?

linux - 如何创建一个子目录,该子目录是格式为 YYYMMDDHHMMSS 的日期时间戳?