JSONをRubyハッシュに変換する方法


137

次の値を保持するJSONオブジェクトがあります。

@value = {"val":"test","val1":"test1","val2":"test2"}

Rubyでループして、キーと値のペアを取得します。を使用する@eachと、Rubyハッシュ形式ではないため、オブジェクトを反復処理しません。

@value = {"val"=>"test","val1"=>"test1","val2"=>"test2"}

上記のJSONオブジェクトをRubyハッシュに変換するにはどうすればよいですか?

回答:


250

次のスニペットはどうですか?

require 'json'
value = '{"val":"test","val1":"test1","val2":"test2"}'
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}

7
value = '{"val":"test","val1":"test1","val2":"test2"}'もっと読みやすいかもしれません。
ラッキークリッシュ

40

Railsのwith_indifferent_accessメソッドを使用して、シンボルまたは文字列で本文にアクセスすることもできます。

value = '{"val":"test","val1":"test1","val2":"test2"}'
json = JSON.parse(value).with_indifferent_access

その後

json[:val] #=> "test"

json["val"] #=> "test"

これがより大きなハッシュオブジェクトに対してより多くのリソースを消費するかどうか誰かが知っていますか?Ruby / Railsは初めてですが、キーと値のペアが重複していると思いますか?
ジョナサン

4

JSONハッシュがどこかにぶら下がっていると仮定して、それをWarHogのバージョンのようなものに自動的に変換するには、JSONハッシュの内容を%q{hsh}タグでラップします。

これは、WarHogの回答のように、必要なすべてのエスケープテキストを自動的に追加するようです。



1

JSONの[]メソッドを誰も指摘しなかったことに驚いています。これにより、JSONのデコードとエンコードが非常に簡単かつ透過的になります。

オブジェクトが文字列に似ている場合、文字列を解析し、解析結果をRubyデータ構造として返します。それ以外の場合は、Rubyデータ構造オブジェクトからJSONテキストを生成し、それを返します。

このことを考慮:

require 'json'

hash = {"val":"test","val1":"test1","val2":"test2"} # => {:val=>"test", :val1=>"test1", :val2=>"test2"}
str = JSON[hash] # => "{\"val\":\"test\",\"val1\":\"test1\",\"val2\":\"test2\"}"

strエンコードされたJSONが含まれるようになりましたhash

それを使用してそれを逆にするのは簡単です:

JSON[str] # => {"val"=>"test", "val1"=>"test1", "val2"=>"test2"}

to_sクラスにはカスタムオブジェクトを定義する必要があり、その内部でオブジェクトをハッシュに変換してから使用to_jsonします。


0

nice_hash gemを使用できます:https : //github.com/MarioRuiz/nice_hash

require 'nice_hash'
my_string = '{"val":"test","val1":"test1","val2":"test2"}'

# on my_hash will have the json as a hash, even when nested with arrays
my_hash = my_string.json

# you can filter and get what you want even when nested with arrays
vals = my_string.json(:val1, :val2)

# even you can access the keys like this:
puts my_hash._val1
puts my_hash.val1
puts my_hash[:val1]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.