【发布时间】:2023-04-07 06:06:03
【问题描述】:
Spring 框架中使用的 Jackson 序列化器的默认行为如下:(来自 spring-data-rest 源代码):
/**
* The most common ISO DateTime Format {@code yyyy-MM-dd'T'HH:mm:ss.SSSZ},
* e.g. "2000-10-31T01:30:00.000-05:00".
* <p>This is the default if no annotation value is specified.
*/
因此,这种格式的一个示例可能是2019-03-20T11:18:46.000+0000。 Swift 也有 ISO8601 解码器,但事实上,对于 Swift,这个字符串的格式是无效的,因为毫秒。如果去掉毫秒部分,swift可以成功反序列化字符串。
struct Test: Codable {
let createdAt: Date
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let data2 = "{\"createdAt\": \"2018-12-05T14:05:35.000+0000\"}".data(using: .utf8)!
let decoded2 = try! decoder.decode(Test.self, from: data2)
Swift 指的是 RFC 3339 https://www.ietf.org/rfc/rfc3339.txt 并且没有提到毫秒。我的问题是 - 那么什么格式是正确的呢?如果某些东西是 ISO 格式,应该严格定义,我通常不希望编写自定义反序列化器 (swift) 或定义用于序列化的自定义模式 (spring)。
【问题讨论】: