参数化JSON键命名

Parameterized JSON key naming

我有以下 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"
  }
}

场景 2:

=> jsonize("value")

输出:

{
  my_json: {
    value: 1,
    name: "John"
  }
}

您可以使用“:”来分隔符号键和值,在您的示例中使用“=>”:

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

您可以将其转换为 symbol 并使用 hash_rocket 语法,您将获得预期的结果

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

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

hash-rocket 语法在 Ruby 自古就有:

{ :foo => 1, "bar" => 2 }

Ruby 1.9(我认为)为符号引入了一个新的冒号快捷语法(同时保持任何键类型的哈希火箭通用):

{ foo: 1, "bar" => 2 }

Ruby 2.2(我认为)介绍了用这种语法符号化字符串的可能性:

{ "foo": 1, "bar" => 2 }

所有这些都做同样的事情。您正在做的是完全合乎语法的 Ruby 代码——在一个足够新的 Ruby 中。在旧的 Rubies 中,您将需要使用旧的可靠的哈希火箭语法:

{ "foo".to_sym => 1, "bar" => 2 }

现在你已经有了一个字符串,你可以进行正常的插值:

{ "f#{'o' * 2}".to_sym => 1, "bar" => 2 }

在你的情况下,你可以

{ "#{custom_key}".to_sym => 1 }

然而,所有这些都是完全没有必要的,因为你可以简单地这样写,在any Ruby中:

{ custom_key.to_sym => 1 }

更好的是,因为您只是在之后立即将所有内容都变成 JSON,所以您甚至不需要符号化的键;所以这两个表达式将有相同的结果:

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

(另请注意,您所说的 JSON 示例——输入和输出——实际上是 而不是 JSON.to_json 也不会输出这样的。在 JSON 中,与普通的 JavaScript 对象文字相反,键 必须 是双引号,这就是to_json 会生成它。不过,您的输入是 Ruby 有效的 Ruby 散列。)