我试图构建一个API包装gem,并将哈希键从API返回的JSON转换为更多的Rubyish格式。将嵌套的哈希键从CamelCase转换为Ruby中的snake_case
JSON包含多层嵌套,包括哈希和数组。我想要做的是递归地将所有密钥转换为snake_case以便于使用。
这里是我到目前为止有:
def convert_hash_keys(value)
return value if (not value.is_a?(Array) and not value.is_a?(Hash))
result = value.inject({}) do |new, (key, value)|
new[to_snake_case(key.to_s).to_sym] = convert_hash_keys(value)
new
end
result
end
以上调用此方法将字符串转换为snake_case:
def to_snake_case(string)
string.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
理想的情况下,其结果将是类似以下内容:
hash = {:HashKey => {:NestedHashKey => [{:Key => "value"}]}}
convert_hash_keys(hash)
# => {:hash_key => {:nested_hash_key => [{:key => "value"}]}}
我得到了递归错误,我试过这种解决方案的每一个版本不会将符号转换超出第一级,或者过度并尝试转换整个散列,包括值。
尝试在辅助类中解决所有这些问题,而不是修改实际的哈希和字符串函数(如果可能)。
预先感谢您。
在做其他事情之前,'if(not ... and not ...)'是使用De Morgan定律的理想场所。你应该写下',除非......或......'。 – sawa 2012-01-03 01:39:01