我正在尝试构建一个 API 包装器 gem,并且在将哈希键从 API 返回的 JSON 转换为更 Rubyish 格式时遇到问题。
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"}]}}
我弄错了递归,我尝试过的这种解决方案的每个版本要么不转换第一级以外的符号,要么过度尝试转换整个哈希,包括值。
如果可能,尝试在帮助类中解决所有这些问题,而不是修改实际的 Hash 和 String 函数。
先感谢您。