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

如何阻止Rails将PUT请求中JSON对象的大小写敏感键转小写?

如何阻止Rails转换JSON请求的键名大小写?

嘿,这个问题我之前也碰到过——Rails默认的JSON参数解析器确实会自动把键转换成蛇形命名(甚至把空格替换成下划线并转成全小写),这在你需要保留原始键名大小写和格式的时候就特别闹心。别担心,有两种靠谱的解决办法:

方法一:全局替换JSON参数解析器(推荐整个应用需要保留键名的场景)

你可以在Rails的初始化文件里自定义一个JSON解析器,完全绕过默认的键名转换逻辑。创建一个新的初始化文件(比如config/initializers/json_param_parser.rb),然后添加以下代码:

ActionDispatch::Request.parameter_parsers[:json] = -> (raw_post) {
  # 使用标准Ruby JSON库解析请求体,不做任何键名修改
  parsed_data = JSON.parse(raw_post)
  # 转换成with_indifferent_access方便后续用字符串或符号访问参数
  parsed_data.is_a?(Hash) ? parsed_data.with_indifferent_access : parsed_data
}

这个代码的作用是替换Rails默认的JSON解析器,直接调用原生的JSON.parse,这样就能完全保留你发送的原始键名(包括大小写、空格等格式)。重启服务器后,再发送请求,params里的键就会和你发送的JSON一致了。

方法二:在特定控制器动作中直接解析原始请求体(适合局部场景)

如果只是某个特定的控制器动作需要保留原始键名,你可以跳过Rails的参数解析,直接解析请求的原始内容:

def update
  # 直接解析请求的原始POST数据
  raw_json = JSON.parse(request.raw_post)
  # 这里raw_json里的键就是你发送的原始格式:{"choiceNames": { "Key Name A": true, ... }}
end

这种方法不需要修改全局配置,只针对单个动作生效,适合不需要全局修改的场景。

注意事项

  • 如果你使用了Strong Parameters,记得要使用原始的键名来做参数白名单,比如:
    params.require(:choiceNames).permit(:"Key Name A", :"Key Name B")
    
  • 全局修改后,整个应用的JSON参数都会保留原始键名,如果你之前依赖蛇形命名的参数,可能需要调整代码适配。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:44:56