2016-04-05 13 views
2

私はRubyの配列を持っている(それはすでにハッシュされていない、なぜ私はそれについて何もできない、私に聞かないでください):私はそれ古典Rubyのハッシュ作るために何をする必要がありますシングルストリングの配列を解析してRubyでハッシュする方法は?

[{":cost=>100", ":size=>2"}] 

何キーと値は? 私の最善の選択肢は何ですか?多分、このような操作のためのライブラリがありますか?

ありがとうございました。

my_string = my_string[2..-3] 
my_array = eval("[#{my_string}]") 

は今、あなたは、文字列に参加することができ、その後、ハッシュにそれをevalし:(

elements = my_array.join(', ') 
my_hash = eval("{ #{ elements } }") 

+5

あなたは無効なコードを掲載しました。私は '{}'を間違って(または挿入した)と思います。 –

+0

おそらく 'eval( '{' + [":cost => 100 "、":size => 2 "]。join( '、')+ '}')'? – sschmeck

+0

実際にはありません。これは、データを視覚的に検証しようとすると「puts」コマンドで取得するものです。そして、私はputs(MyClass.class)でこのオブジェクトのクラス名を印刷しているときに "Array"クラスを取得します。 –

答えて

1

まず我々は、それが有効な配列のように見えるように文字列をきれいにする必要がありますこれはもっと少ない行で行うことができますが、わかりやすくするために区切っています)

+1

'eval'を使うときはいつでも**特別な注意を払うべきです** **任意の文字列を実行しないことに注意することは価値があります。このデータが信頼できるソースから得られたものであることを確かめてください。 – tadman

1

モジュールを使ってこれを行うことができます。間違いなく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} 

ので、タスクがjstrstrの変換に帰着:

"[{\":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} 
関連する問題