Ruby on rails 参数化JSON密钥命名

Ruby on rails 参数化JSON密钥命名,ruby-on-rails,json,ruby,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Json,Ruby,Ruby On Rails 3,Ruby On Rails 4,我有以下JSON: { my_json: { id: 1, name: "John" } } 如何通过参数化自定义密钥名称,如: def jsonize(custom_key="id") { my_json: { "#{custom_key}": 1, name: "John" } } end 将输出为: 情景1: => jsonize 输出: { my_json: { id: 1, name:

我有以下JSON:

{
  my_json: {
    id: 1,
    name: "John"
  }
}
如何通过参数化自定义密钥名称,如:

def jsonize(custom_key="id")
{
    my_json: {
      "#{custom_key}": 1,
      name: "John"
    }
  }
end
将输出为:

情景1:

=> jsonize
输出:

{
  my_json: {
    id: 1,
    name: "John"
  }
}
{
  my_json: {
    value: 1,
    name: "John"
  }
}
情景2:

=> jsonize("value")
输出:

{
  my_json: {
    id: 1,
    name: "John"
  }
}
{
  my_json: {
    value: 1,
    name: "John"
  }
}
您可以使用“:”来分隔符号键和值,在示例中使用“=>”:

def jsonize(custom_key="id")
{
    my_json: {
      "#{custom_key}" => 1,
      name: "John"
    }
  }
end

您只需将其转换为
symbol
并使用
hash\u-rocket
语法即可获得预期结果

def jsonize(custom_key = "id")
  {
    my_json: {
      custom_key.to_sym => 1,
      name: "John"
    }
  }
end

#=> jsonize('foo')
#=> {
#=>     :my_json => {
#=>          :foo => 1,
#=>         :name => "John"
#=>     }
#=> }

哈希火箭语法自古以来就在Ruby中使用:

{ :foo => 1, "bar" => 2 }
Ruby 1.9(我认为)引入了一种新的冒号快捷语法,只用于符号(同时对任何键类型保留哈希火箭):

Ruby 2.2(我认为)引入了用这种语法表示字符串的可能性:

{ "foo": 1, "bar" => 2 }
所有这些都做同样的事情。您所做的是完全符合语法的Ruby代码——在一个全新的Ruby中。在旧版Rubies中,您需要使用旧的可靠哈希火箭语法:

{ "foo".to_sym => 1, "bar" => 2 }
现在您已经有了一个字符串,可以执行法线插值:

{ "f#{'o' * 2}".to_sym => 1, "bar" => 2 }
在你的情况下,你可以写

但是,所有这些都是完全不必要的,因为您可以在任何Ruby中简单地编写:

更妙的是,由于您只是将所有内容立即转换为JSON,因此您甚至不需要符号化键;所以这两个表达式将有相同的结果:

{ custom_key.to_sym => 1 }.to_json
{ custom_key => 1 }.to_json

(还要注意,作为JSON示例的输入和输出实际上都不是JSON,也不会是
。to_JSON
输出。在JSON中,与普通JavaScript对象文字相反,键必须是双引号,这就是
to_JSON
将产生它的方式。不过,您的输入是一个Ruby有效的Ruby哈希。)

您的代码将正常工作,并且正确无误。这是打字错误吗<代码>“{custome_key}”:1,它应该是
“{custom_key}”:1,
。您好@GokulM,谢谢您指出错误。但这不是我的意思。当我运行该方法时,它抛出一个错误
语法错误,意外的“:”,期望=>“#{custome_key}”:1,
,因为它不应该这样构造。问题是,我可以进行参数化密钥命名吗?:)谢谢这是正确的,但我必须选择接受的答案。所以我会投票赞成你的答案。
{ custom_key.to_sym => 1 }.to_json
{ custom_key => 1 }.to_json