我正在尝试构建一个API包装器gem,并且在将哈希键从API返回的JSON转换为更Ruby风格的格式方面遇到了问题。
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"}]}}
我在递归中出现了问题,我尝试过各种解决方案,但要么无法转换除第一级以外的符号,要么过度地尝试转换整个哈希表,包括值。
如果可能的话,我想在辅助类中解决所有这些问题,而不是修改实际的哈希表和字符串函数。
提前感谢您的帮助。