我試圖構建一個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