You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析请求体中带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:22:09