Ich frage mich, wie man ein json-formatiertes Schlüsselwertpaar am besten in Ruby-Hash mit Symbol als Schlüssel konvertiert: Beispiel:
{ 'user': { 'name': 'foo', 'age': 40, 'location': { 'city' : 'bar', 'state': 'ca' } } }
==>
{ :user=>{ :name => 'foo', :age =>'40', :location=>{ :city => 'bar', :state=>'ca' } } }
Gibt es eine Hilfsmethode, die dies tun kann?
ruby-on-rails
ruby
json
ez.
quelle
quelle
http://stackoverflow.com/a/43773159/1297435
für Rails 4.1Antworten:
Wenn Sie beim Parsen des JSON-Strings den Edelstein json verwenden, können Sie die Option symbolize_names übergeben. Siehe hier: http://flori.github.com/json/doc/index.html (siehe unter Analyse)
z.B:
quelle
:symbolize_keys
? Warum hat sich dieser Name geändert?symbolize_keys
ist eine Rails-Sache.Leventix, vielen Dank für Ihre Antwort.
Die Marshal.load- Methode (Marshal.dump (h)) weist wahrscheinlich die Integrität der verschiedenen Methoden auf, da die ursprünglichen Schlüsseltypen rekursiv beibehalten werden .
Dies ist wichtig, wenn Sie einen verschachtelten Hash mit einer Mischung aus Zeichenfolgen- und Symbolschlüsseln haben und diese Mischung beim Dekodieren beibehalten möchten (dies kann beispielsweise passieren, wenn Ihr Hash neben hochkomplexen / verschachtelten dritten auch Ihre eigenen benutzerdefinierten Objekte enthält -Party-Objekte, deren Schlüssel Sie aus irgendeinem Grund nicht bearbeiten / konvertieren können (z. B. eine Projektzeitbeschränkung).
Z.B:
Methode 1 : JSON.parse - symbolisiert alle Schlüssel rekursiv => Bewahrt nicht die ursprüngliche Mischung
Methode 2 : ActiveSupport :: JSON.decode - symbolisiert nur Schlüssel der obersten Ebene => Erhält nicht die ursprüngliche Mischung
Methode 3 : Marshal.load - behält die ursprüngliche Zeichenfolge / Symbol-Mischung in den verschachtelten Schlüsseln bei. PERFEKT!
Wenn es keinen Nachteil gibt, den ich nicht kenne, würde ich denken, dass Methode 3 der richtige Weg ist.
Prost
quelle
Es ist nichts eingebaut, um den Trick auszuführen, aber es ist nicht zu schwierig, den Code dafür mit dem JSON-Gem zu schreiben.
symbolize_keys
Wenn Sie diese verwenden, ist in Rails eine Methode integriert, die jedoch nicht die von Ihnen benötigten Schlüssel rekursiv symbolisiert.Wie Leventix sagte, verarbeitet das JSON-Gem nur Zeichenfolgen mit doppelten Anführungszeichen (was technisch korrekt ist - JSON sollte mit doppelten Anführungszeichen formatiert werden). Dieses Stück Code bereinigt das, bevor versucht wird, es zu analysieren.
quelle
Rekursive Methode:
quelle
Natürlich gibt es ein Juwel von json , aber das behandelt nur doppelte Anführungszeichen.
quelle
JSON.parse(JSON.generate([:a])) # => ["a"]
Marshal.load(Marshal.dump([:a]))
stattdessen verwenden : .Eine andere Möglichkeit, dies zu handhaben, ist die Verwendung der YAML-Serialisierung / Deserialisierung, bei der auch das Format des Schlüssels erhalten bleibt:
Der Vorteil dieses Ansatzes scheint ein Format zu sein, das besser für REST-Services geeignet ist ...
quelle
YAML.load
soll beliebige Objekte serialisieren (zB für Cache). Der VorschlagYAML.safe_load
wurde einige Monate nach diesem Blog-Beitrag eingeführt, daher ist es wichtig, das Richtige zu verwenden: github.com/ruby/psych/commit/…Am bequemsten ist es, das Juwel nice_hash zu verwenden: https://github.com/MarioRuiz/nice_hash
quelle