Konvertieren verschachtelter Hash-Schlüssel von CamelCase nach snake_case in Ruby
Ich versuche zu bauen, ein API-wrapper gem, und Probleme mit der Konvertierung von hash-Schlüssel zu mehr Rubyish format aus der JSON-API zurückgibt.
JSON enthält mehrere Ebenen der Verschachtelung, die beiden Hashes und Arrays. Was ich will zu tun ist, um rekursiv konvertieren alle Tasten snake_case für eine einfachere Nutzung.
Hier ist, was ich habe, so weit:
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
Den oben ruft diese Methode zum konvertieren von strings zu 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
Ideal, das Ergebnis wäre ähnlich der folgenden:
hash = {:HashKey => {:NestedHashKey => [{:Key => "value"}]}}
convert_hash_keys(hash)
# => {:hash_key => {:nested_hash_key => [{:key => "value"}]}}
Ich bin immer die Rekursion falsch, und jeder version von diese Art von Lösung, die ich versucht habe, entweder nicht konvertieren Symbole über der ersten Ebene, oder geht über Bord und versucht, Sie zu konvertieren die gesamte hash-Werte, einschließlich der Werte.
Versuchen zu lösen, alle diese in eine helper-Klasse, sondern als änderung der tatsächlichen Hash und String-Funktionen, wenn möglich.
Vielen Dank im Voraus.
InformationsquelleAutor der Frage Andrew Stewart | 2012-01-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie zur Behandlung von Array-und Hash-getrennt. Und, wenn Sie in Schienen, die Sie verwenden können,
Unterstrich
statt Ihre homebrewto_snake_case
. Zuerst ein kleiner Helfer um den Lärm zu reduzieren:Wenn Ihr Hashes die Schlüssel, sind nicht Symbole oder Strings, dann können Sie ändern
underscore_key
angemessen.Wenn Sie ein Array, dann möchten Sie einfach rekursiv anwenden
convert_hash_keys
auf jedes element des Array, wenn Sie einen Hash, den Sie fixieren möchten, die Tasten mitunderscore_key
und geltenconvert_hash_keys
zu jedem der Werte; wenn Sie etwas anderes haben, dann möchte man, dass es vorbei durch unberührte:InformationsquelleAutor der Antwort mu is too short
Wenn Sie Schienen:
Beispiel mit hash: camelCase zu snake_case:
Quelle:
http://apidock.com/rails/v4.0.2/Hash/transform_keys
Für verschachtelte Attribute verwenden deep_transform_keys statt transform_keys, Beispiel:
Quelle: http://apidock.com/rails/v4.2.7/Hash/deep_transform_keys
InformationsquelleAutor der Antwort Hubert Olender
Akzeptiert die Antwort von 'mu ist zu kurz' wurde umgewandelt in ein Juwel, futurechimp ist Plissken:
https://github.com/futurechimp/plissken/blob/master/lib/plissken/ext/hash/to_snake_keys.rb
Dieses sieht wie es funktionieren sollte außerhalb der Schienen als der Unterstrich-Funktion ist enthalten.
InformationsquelleAutor der Antwort A Fader Darkly
Wenn Sie mit der active_support Bibliothek, die Sie verwenden können, deep_transform_keys! etwa so:
InformationsquelleAutor der Antwort JayJay