如何解析请求体中带poll键的JSON对象?Vapor框架实践
Vapor框架中解析嵌套JSON对象的解决方案
我在使用Vapor开发时遇到了JSON解析的问题,这里分享我的问题场景和解决方案,希望能帮到遇到同样困扰的开发者。
问题背景
最初我写了这样的代码来处理Poll对象的创建逻辑:
func createPoll(on req: Request) throws -> String { let poll = try req.content.decode(Poll.self) return poll.save(on: req).map(to: Poll.self) { return poll } }
这段代码能正常解析顶层结构的JSON数据:
{ "title": "Once Poll", "option1": "Black finish", "option2": "Dark Gray finish", "votes1": 10, "votes2": 0 }
但当客户端传来的JSON把Poll对象包裹在poll键下时,上面的代码就完全无法完成解析了:
{ "poll": { "title": "Once Poll", "option1": "Black finish", "option2": "Dark Gray finish", "votes1": 10, "votes2": 0 } }
解决方案
我通过创建一个包裹结构体来匹配嵌套的JSON结构,成功解决了这个解析问题:
struct PollRequestObject: Content { let poll: Poll? } func createPoll(on req: Request) throws -> Future<Poll> { guard let poll = try req.content.decode(PollRequestObject.self).poll else { throw Abort(.badRequest) } return poll.save(on: req).map(to: Poll.self) { return poll } }
思路说明
- 定义
PollRequestObject结构体并遵循Vapor的Content协议,内部设置一个可选的Poll类型属性poll,完美对应JSON中的poll嵌套键。 - 在路由处理函数中,先解码
PollRequestObject实例,再通过guard语句安全取出其中的poll对象;如果poll为nil,则直接抛出badRequest类型的错误。 - 最后正常执行
poll对象的保存逻辑,并返回对应的Future<Poll>结果。
内容的提问来源于stack exchange,提问作者Grant NEALE
相关产品推荐
相关产品推荐

