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"}]}}
再帰が間違っています。私が試したこの種のソリューションのすべてのバージョンは、最初のレベルを超えてシンボルを変換しないか、船外に出て、値を含むハッシュ全体を変換しようとします。
可能であれば、実際のハッシュ関数と文字列関数を変更するのではなく、ヘルパー クラスでこれらすべてを解決しようとしています。
前もって感謝します。