在 JBuilder 中自动将散列键转换为驼峰命名法
Automatically convert hash keys to camelCase in JBuilder
我正在使用 JBuilder 版本 2.4.1 和 Rails 4.2.6。我正在尝试将复杂对象序列化为 JSON。代码如下所示:
json.key_format! camelize: :lower
json.data_object @foo
@foo
看起来像这样:
{
key: 'value',
long_key: 'value'
}
我希望它呈现为
{
"dataObject": {
"key": "value",
"longKey": "value"
}
}
但它保留了原始哈希键,仅将 data_object 转换为驼峰式
{
"dataObject": {
"key": "value",
"long_key": "value"
}
}
所以问题是:使用 JBuilder 驼峰化哈希键的正确方法是什么?
尝试在您的应用程序中进行全局设置(例如 config/environment.rb)
Jbuilder.key_format camelize: :lower
正如 Bryce 所提到的,Jbuilder 使用 to_json 而不是处理散列。
一个简单的解决方案是使用json.set!
手动序列化哈希。
json.key_format! camelize: :lower
json.data_object do
@foo.each do |key, value|
json.set! key, value
end
end
不过,有一个问题:如果@foo 为空,它根本不会创建对象。这些是我找到的解决方案:
在序列化之前定义一个空散列
json.key_format! camelize: :lower
json.data_object({}) # don't forget parentheses or Ruby will handle {} as a block
json.data_object do
@foo.each do |key, value|
json.set! key, value
end
end
如果源变量为空,则序列化一个空散列
json.key_format! camelize: :lower
if (@foo.empty?) do
json.data_object({})
else
json.data_object do
@foo.each do |key, value|
json.set! key, value
end
end
end
或者如果您更喜欢扁平化的代码
json.key_format! camelize: :lower
json.data_object({}) if @foo.empty?
json.data_object do
@foo.each do |key, value|
json.set! key, value
end
end unless @foo.empty?
但是,如果您必须序列化嵌套对象,这些解决方案将不起作用。您可以通过猴子修补 Jbuilder
中的 json
对象来实现深度序列化
def json.hash!(name, hash)
if hash.empty?
set! name, {}
else
set! name do
hash.each do |key, value|
if value.is_a?(Hash)
hash! key, value
else
set! key, value
end
end
end
end
end
然后您可以简单地使用 json.hash! :data_object, @foo
并获得所需的结果。
我不确定这是否仍然相关。但是对于那些仍在寻找优雅解决方案的人,我建议看看:
https://github.com/vigetlabs/olive_branch
This gem lets your API users pass in and receive camelCased or dash-cased keys, while your Rails app receives and produces snake_cased ones.
这里是 post 作者解释了这个 gem 背后的想法。
https://www.viget.com/articles/introducing-olivebranch/
希望对您有所帮助
我正在使用 JBuilder 版本 2.4.1 和 Rails 4.2.6。我正在尝试将复杂对象序列化为 JSON。代码如下所示:
json.key_format! camelize: :lower
json.data_object @foo
@foo
看起来像这样:
{
key: 'value',
long_key: 'value'
}
我希望它呈现为
{
"dataObject": {
"key": "value",
"longKey": "value"
}
}
但它保留了原始哈希键,仅将 data_object 转换为驼峰式
{
"dataObject": {
"key": "value",
"long_key": "value"
}
}
所以问题是:使用 JBuilder 驼峰化哈希键的正确方法是什么?
尝试在您的应用程序中进行全局设置(例如 config/environment.rb)
Jbuilder.key_format camelize: :lower
正如 Bryce 所提到的,Jbuilder 使用 to_json 而不是处理散列。
一个简单的解决方案是使用json.set!
手动序列化哈希。
json.key_format! camelize: :lower
json.data_object do
@foo.each do |key, value|
json.set! key, value
end
end
不过,有一个问题:如果@foo 为空,它根本不会创建对象。这些是我找到的解决方案:
在序列化之前定义一个空散列
json.key_format! camelize: :lower json.data_object({}) # don't forget parentheses or Ruby will handle {} as a block json.data_object do @foo.each do |key, value| json.set! key, value end end
如果源变量为空,则序列化一个空散列
json.key_format! camelize: :lower if (@foo.empty?) do json.data_object({}) else json.data_object do @foo.each do |key, value| json.set! key, value end end end
或者如果您更喜欢扁平化的代码
json.key_format! camelize: :lower json.data_object({}) if @foo.empty? json.data_object do @foo.each do |key, value| json.set! key, value end end unless @foo.empty?
但是,如果您必须序列化嵌套对象,这些解决方案将不起作用。您可以通过猴子修补 Jbuilder
中的json
对象来实现深度序列化
def json.hash!(name, hash)
if hash.empty?
set! name, {}
else
set! name do
hash.each do |key, value|
if value.is_a?(Hash)
hash! key, value
else
set! key, value
end
end
end
end
end
然后您可以简单地使用 json.hash! :data_object, @foo
并获得所需的结果。
我不确定这是否仍然相关。但是对于那些仍在寻找优雅解决方案的人,我建议看看:
https://github.com/vigetlabs/olive_branch
This gem lets your API users pass in and receive camelCased or dash-cased keys, while your Rails app receives and produces snake_cased ones.
这里是 post 作者解释了这个 gem 背后的想法。 https://www.viget.com/articles/introducing-olivebranch/
希望对您有所帮助