Tôi đang cố gắng xây dựng một gem wrapper API, và có vấn đề với việc chuyển đổi các khóa băm sang một định dạng Rubyish hơn từ JSON API trả về.Chuyển đổi các khóa băm lồng nhau từ CamelCase sang snake_case trong Ruby
JSON chứa nhiều lớp lồng nhau, cả Hashes và Arrays. Những gì tôi muốn làm là chuyển đổi đệ quy tất cả các khóa thành snake_case để sử dụng dễ dàng hơn.
Đây là những gì tôi đã có cho đến nay:
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
Các cuộc gọi trên phương pháp này để chuyển đổi chuỗi để 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
Lý tưởng nhất, kết quả sẽ tương tự như sau:
hash = {:HashKey => {:NestedHashKey => [{:Key => "value"}]}}
convert_hash_keys(hash)
# => {:hash_key => {:nested_hash_key => [{:key => "value"}]}}
Tôi nhận được lỗi đệ quy và mọi phiên bản của loại giải pháp này mà tôi đã thử không chuyển đổi các biểu tượng vượt quá mức đầu tiên hoặc đi quá mức và cố gắng chuyển đổi toàn bộ băm, bao gồm các giá trị.
Cố gắng giải quyết tất cả điều này trong lớp trợ giúp, thay vì sửa đổi các hàm băm và chuỗi thực tế, nếu có thể.
Cảm ơn bạn trước.
Trước khi làm bất cứ điều gì khác, 'if (không ... và không ...)' là một nơi hoàn hảo để sử dụng luật của De Morgan. Bạn nên viết nó 'trừ khi ... hoặc ... '. – sawa