gpt4 book ai didi

swift - Vapor:日期对象以字符串格式解码,但解码器需要 double

转载 作者:行者123 更新时间:2023-12-05 03:52:47 26 4
gpt4 key购买 nike

我有一个如下所示的数据模型:

struct Post: Content, MySQLModel, Migration, Equatable {
var id: Int?
var userId: Int
var title: String
var body: String
var creationDate: Date?
var lastEditDate: Date?

static func prepare(on connection: MySQLConnection) -> Future<Void> {
return MySQLDatabase.create(self, on: connection) { builder in
builder.field(for: \.id, isIdentifier: true)
builder.field(for: \.userId)
builder.field(for: \.title)
builder.field(for: \.body, type: .text())
builder.field(for: \.creationDate)
builder.field(for: \.lastEditDate)
}
}
}

如果我在数据库中有一些实例,我可以通过路径中的帖子 ID 安全地进行查询,我会得到一个对象,其创建/上次编辑日期格式为字符串格式:

func retrievePost(on req: Request) throws -> Future<Post> {
let id = try req.parameters.next(Int.self)

return Post.find(id, on: req).map(to: Post.self) { post in
guard let post = post else {
throw Abort(.notFound)
}

return post
}
}

如果我进行 GET 查询,这就是我在响应正文中返回的内容:

{
"body": "value",
"id": 8723,
"title": "value",
"creationDate": "2020-05-27T15:24:41Z",
"userId": 0
}

这是我的 PUT 方法实现:

func updatePost(on req: Request) throws -> Future<Post> {
var updatedPost = try req.content.syncDecode(Post.self)

guard let id = updatedPost.id else {
throw Abort(.badRequest)
}

return Post.find(id, on: req).flatMap { post in
guard let _ = post else {
throw Abort(.notFound)
}

return updatedPost.save(on: req)
}
}

但是如果我发送一个 PUT 请求传递与我在 GET 响应正文中得到的完全相同的字段,并将创建日期格式化为字符串,我会收到此错误:

{
"error": true,
"reason": "Could not convert to `Double`: str(\"2020-05-27T15:24:41Z\")"
}

它期待双倍。如果我尝试发送 1970 年之后的秒数,它会起作用,但我不明白为什么使用字符串日期对同一个日期对象进行编码并使用 double 进行解码。如何解决这个问题?

最佳答案

使用 Vapor 4,我指定了一个自定义 JSONDecoder。这可以在全局范围内完成,也可以如此处所示针对单个请求完成。

在这种情况下,我正在解码一个包含日期字段的 POST 结构 GetLogsRequest

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let request = try req.content.decode(GetLogsRequest.self, using: decoder)

参见 https://docs.vapor.codes/4.0/content/

关于swift - Vapor:日期对象以字符串格式解码,但解码器需要 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62046909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com