モジュールを使ってこれを行うことができます。間違いなくeval
を使用するよりも安全です。
JSON
がどのように使用できるかを確認するには、いくつかのリバースエンジニアリングをしましょう。あなたはハッシュを作成したい:
h = { :cost=>100, :size=>2 }
文字列から:
str = '[{":cost=>100", ":size=>2"}]'
#=> "[{\":cost=>100\", \":size=>2\"}]"
はのは、そのハッシュはJSON文字列としてエンコードされる方法を見てみましょう:
require 'json'
jstr = JSON.generate(h)
#=> "{\"cost\":100,\"size\":2}"
我々はjstr
を持っていたら(これは文字列ではありません)、目的のハッシュを抽出することができます:
JSON.parse(jstr)
#=> {"cost"=>100, "size"=>2}
ので、タスクがjstr
にstr
の変換に帰着:
"[{\":cost=>100\", \":size=>2\"}]" => "{\"cost\":100,\"size\":2}"
おそらく最も簡単な方法は、最初に、我々は正規表現で行うことができ、キーと値を引き出すことです。
r =/
( # start capture group 1
[a-z] # match a lowercase letter
\w* # match >= 0 word characters
) # close capture group 1
=> # match characters
(-?\d+) # optionally match a minus sign followed by > 0 digits in
# capture group 2
/x # free-spacing regex definition mode
arr = str.scan r
#=> [["cost", "100"], ["size", "2"]]
私たちは、今jstr
を形成することができます
jstr = "{#{ arr.map { |k,v| "\"#{k}\":#{v}" }.join(",") }}"
#=> "{\"cost\":100,\"size\":2}"
確認するには、
h = JSON.parse(jstr)
#=> {"cost"=>100, "size"=>2}
あなたは無効なコードを掲載しました。私は '{}'を間違って(または挿入した)と思います。 –
おそらく 'eval( '{' + [":cost => 100 "、":size => 2 "]。join( '、')+ '}')'? – sschmeck
実際にはありません。これは、データを視覚的に検証しようとすると「puts」コマンドで取得するものです。そして、私はputs(MyClass.class)でこのオブジェクトのクラス名を印刷しているときに "Array"クラスを取得します。 –