如何阻止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
相关产品推荐
相关产品推荐

