APIラッパーの宝石を作成しようとしています。APIが返すJSONからハッシュキーをRuby形式に変換する際に問題があります。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 ...とnot ...)'はDe Morganの法則を使うのに最適な場所です。あなたは '...または... ... 'と書かなければなりません。 – sawa