2017-08-17 2 views
1

Ich habe eine ZeichenfolgeNeed Alternative für eval

string = '{"a" => [{"b" => 2}]}' 

eval(string) 
# => {"a" => [{"b" => 2}]} 

I Alternative brauchen für diese Ausgabe zu haben, wie {"a" => [{"b" => 2}]}

+3

Alternative 1) Sie einen begrenzten Rubin Parser bauen könnte, die nur Hashes analysieren kann, Arrays und einige Grundelemente. Oder alternative 2) mit ein paar String-Substitutionen, machen Sie diese Zeichenfolge eine JSON-Zeichenfolge und verwenden Sie 'JSON.parse'. –

+1

Woher kommt diese Saite? Haben Sie die Kontrolle über diese Daten? Ist es in Ihrer Datenbank gespeichert? – MrYoshiji

+0

JSON.parse funktioniert nicht –

Antwort

0

Wenn Daten in Strings zu speichern, die programmatisch analysiert werden wird, ist es am besten, diese Strings Format ein standardisiertes Datenaustauschformat wie JSON. Ihre Zeichenfolge, formatiert in JSON, würde wie folgt aussehen:

{"a": [{"b": 2}]} 

Wenn Sie irgendeine Kontrolle darüber, wie die Daten in Excel gespeichert wird, sollten Sie sicherstellen, dass es im JSON-Format wie diese gespeichert wird. Wenn Sie aus irgendeinem Grund das Format der Daten in Excel nicht ändern dürfen, ist es die nächstbeste Option, sie vor der Analyse in JSON zu konvertieren.

Zum Glück für Sie, die Daten sind bereits sehr ähnlich zu JSON. Der einzige Unterschied besteht darin, dass JSON verwendet : statt =>, so können Sie dies tun:

require "json" 
string = '{"a" => [{"b" => 2}]}'.gsub("=>", ":") 
data = JSON.parse string 
p data # => {"a" => [{"b" => 2}]} 
+0

Ja, wenn es keine Zeichenfolge Werte gibt, sollte diese Regex gut funktionieren. Wenn es jedoch String-Werte gibt und sie '=>' .... enthalten: –

+0

@SergioTulentsev true, und ich glaube nicht, dass eine Regex letztlich für die rekursive Natur einer "Hash-artigen Zeichenfolge in einem Hash. " Aber die Antwort kann ausreichen, wenn die Hash-Strings des OP garantiert einfache Schlüssel-Wert-Paare (vielleicht nur ganze Zahlen, nur alphanumerische Strings, etc.) haben. – eiko

+0

Stimmen Sie damit überein. –