【问题标题】:Why Rails deserializes snake case data structures but serializes camel case data structures?为什么 Rails 反序列化蛇案例数据结构而序列化骆驼案例数据结构?
【发布时间】:2015-02-01 00:34:49
【问题描述】:

这是我的第一个 Ruby on Rails 项目之一,我很奇怪在我的请求中发送带有以蛇形大小写的属性的 JSON,并在我的响应中接收带有以驼色大小写的属性的 JSON。

以下是请求负载的示例:

{
  "end_point":"test"
}

这是响应负载的示例:

{
  "endPoint":"test"
}

以下是使用并返回上述相似数据结构的代码: 定义创建

def create
    @api = interactor.create(params[:organization_id], api_params)
    respond_to do |format|
        format.json { render :show, status: :created, location: api_url(@api) }
    end
end

【问题讨论】:

  • 你能贴出生成 JSON 的代码吗
  • @jumpingcode 感谢您的关注!我已经编辑了问题,以便您了解正在发生的事情
  • @Motta :这条线是做什么的:@api = interactor.create(params[:organization_id], api_params) interactor 这里是什么?模型课?一个方法?什么?
  • 它是一个服务类,我在模型中保留了持久化固有的逻辑,在交互器上保留了业务固有的逻辑。
  • @Motta :查看更新的版本。另外,“某种拦截器”?那有什么意思?我不清楚你到底想用interceptor做什么。

标签: ruby-on-rails json serialization


【解决方案1】:

使用ActiveSupport(Rails 自带)中的String#camelize 方法,如下所示:

attributes_hash = { "test_data" => "test" }
json_hash = Hash[attributes_hash.map {|k, v| [k.camelize(:lower), v] }]
#=> {"testData"=>"test"}

现在,您可以将其转换为 JSON 字符串:

p json_hash.to_json #=> "{\"testData\":\"test\"}"

更新:您可以在模型类中覆盖 serializable_hash 方法(因为您不清楚代码中的 interceptor 到底是什么,我假设您需要将这个在您要实例化其对象以将数据作为 JSON 发送的类中),就像这样 -

def serializable_hash(options = nil)
  options ||= {}

  if options[:camelize]
    Hash[attributes.map {|k, v| [k.camelize(:lower), v] }]
  else
    super
  end
end

现在,您可以这样做:@api.to_json(:camelize => true),它会将属性转换为首字母以外的大小写,即:endPoint

【讨论】:

  • 嗨 Surya,感谢您的快速回答,但它没有回答我的问题。我正在处理请求和响应,我只是让 rails 回答控制器或接收一些参数,然后我得到描述的行为。
  • @Motta :想法是在将对象转换为 json 时更改属性。如果您可以分享代码中interactor 的内容,那么我想我可以为您指明正确的方向。它是模型还是纯 ruby​​ 类?
  • 我已经编辑了问题,包括消费和序列化数据结构的控制器,它既不是转换也不是交互器
  • 我不想在特定模型中这样做,我想在这个拦截器(或类似的)中接收camlized数据结构并反序列化到我的蛇案例红宝石数据结构。响应数据结构格式可以,不需要任何转换。
  • 然后覆盖ActiveRecord::Base类中的上述方法而不是单个模型。
猜你喜欢
  • 2019-08-07
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2011-05-03
  • 2019-05-15
  • 2020-02-10
相关资源
最近更新 更多