2016-08-10 3 views
-2

Ich glaube, ich habe mich in eine Ecke geschrieben. Grundsätzlich habe ich eine Reihe von Hashes, so.Mit gsub ersetzen "=>" durch ":" in einem Array von Hashes

my_hashes = [{"colorName"=>"first", "hexValue"=>"#f00"}, {"colorName"=>"green", "hexValue"=>"#0f0"}, 
    {"colorName"=>"blue", "hexValue"=>"#00f"}, {"colorName"=>"cyan", "hexValue"=>"#0ff"}, 
    {"colorName"=>"magenta", "hexValue"=>"#f0f"}, {"colorName"=>"yellow", "hexValue"=>"#ff0"}, 
    {"colorName"=>"black", "hexValue"=>"#000"}] 

Ich muss JSON.parse verwenden, um schließlich diese Hashes in CSV-Format zu transformieren. Das einzige Problem ist, dass ich JSON.parse nicht arbeiten kann, solange das "=>" Symbol vorhanden ist. Ich habe versucht, nur eine reguläre gsub ('=>', ':'), aber es scheint, dass ich es nicht verwenden kann, da dies ein Array von Hashes ist. Ich habe Variationen der folgenden Methode versucht:

my_hashes.each do |hash| 
    hash.each do |key, value| 
     key.gsub!('=>', ':') 
     value.gsub!('=>', ':') 
    end 
end 

Ich brauche diese Hash-Werte intakt zu bleiben, so auch wenn ich sie Intro Strings verwandeln, wenn ich sie zurückzuverwandeln sie werden immer noch die ‚=>‘ Symbol verfügbar. Irgendein Rat?

+3

Verwenden Sie einfach 'my_hashes.to_json' es in eine JSON-String zu verwandeln . Sie müssen möglicherweise zuerst "json" anfordern. –

+1

Warum den Hash in JSON und dann CSV konvertieren? Warum nicht direkt CSV mit ['csv' aus der Standardbibliothek] (http://ruby-doc.org/stdlib-2.3.1/libdoc/csv/rdoc/index.html)? –

+1

Dies ist ein [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Anstatt die Hashes zu konvertieren, müssen Sie beschreiben, was Sie tun möchten, und dann einen besseren Weg finden, dies zu erreichen. –

Antwort

2

Die Änderung => zu : würde keinen Ruby-Hash zu einem JSON-Objekt machen. Und tatsächlich kann man einen Hash nicht einfach so ändern. Weil die geschriebene Darstellung eines Hashs nicht mit der interpretierten Version im Speicher übereinstimmt.

Aber das löst nicht das Problem: Sie benötigen eine JSON Darstellung eines Ruby-Hash, nur to_json verwenden:

my_hashes = [ 
{"colorName"=>"first", "hexValue"=>"#f00"}, 
{"colorName"=>"green", "hexValue"=>"#0f0"}, 
{"colorName"=>"blue", "hexValue"=>"#00f"}, 
{"colorName"=>"cyan", "hexValue"=>"#0ff"}, 
{"colorName"=>"magenta", "hexValue"=>"#f0f"}, 
{"colorName"=>"yellow", "hexValue"=>"#ff0"}, 
{"colorName"=>"black", "hexValue"=>"#000"} 
] 

require 'json' 
my_hashes.to_json 
#=> "[{"colorName":"first","hexValue":"#f00"},{"colorName":"green","hexValue":"#0f0"},{"colorName":"blue","hexValue":"#00f"},{"colorName":"cyan","hexValue":"#0ff"},{"colorName":"magenta","hexValue":"#f0f"},{"colorName":"yellow","hexValue":"#ff0"},{"colorName":"black","hexValue":"#000"}]" 
+0

Ja, Sie sind völlig richtig. Hoffentlich habe ich ein bisschen mehr verstanden, nachdem ich mit JSON gearbeitet habe. –

1
my_hashes=[{"colorName"=>"first", "hexValue"=>"#f00"}] 

new_data = my_hashes.to_json.gsub(/\=\>/, ':') 

data = Json.parse new_data 
+0

Sie könnten diese Antwort verbessern, indem Sie eine Erklärung liefern und nicht nur den Code. –

+0

Sicher nächstes Mal werde ich in Erinnerung bleiben Dank –

+0

Vielen Dank für den Hinweis! –