【发布时间】:2012-03-07 14:22:56
【问题描述】:
我正在寻找一种方法来更改 json 对象的键名,该对象是 ruby 上的哈希,如下所示
来源
{ "a" => "b", "b" => "bb" }
结果
{ "c" => "b", "b" => "bb" }
有个好主意吗?
【问题讨论】:
我正在寻找一种方法来更改 json 对象的键名,该对象是 ruby 上的哈希,如下所示
来源
{ "a" => "b", "b" => "bb" }
结果
{ "c" => "b", "b" => "bb" }
有个好主意吗?
【问题讨论】:
source = { "a" => "b", "b" => "bb", "c" => "lol" }
PATTERN = { "a" => "c", "c" => "e" }
source.inject({}) do |new_hash, (k, v)|
key = PATTERN[k] || k
new_hash[key] = v
new_hash
end
#=> { "c" => "b", "b" => "bb", "e" => "lol" }
【讨论】:
如果你经常需要这个功能,你可以扩展 Ruby Hash 类。
实现会因 ruby 版本而异,但大致如下:
class Hash
module ClassMethods
def self.replace_key(old_key, new_key)
self[new_key] = self[old_key]
self.delete(old_key)
end
end
end
基本上,使用新键和旧值在哈希中创建一个新的键值对。然后删除原来的对。
注意:从性能角度来看,不建议对大型哈希执行此类操作。
【讨论】:
如果您正在序列化 ActiveRecord 或 ActiveModel 对象,您可以覆盖该类的as_json 方法。像这样:
class Foo < ActiveRecord::Base
def as_json(options = { })
super((options.select {|k,v| k.to_s != "a" }).merge("c" => options["a"]))
end
end
【讨论】: