2012-12-05 38 views
4

我很困惑,爲什麼在下面的例子中鑰匙的符號版本不起作用。如上所示,我使用的是Ruby 1.9.3。這是一個更大的應用程序的一部分,但已能夠縮小到這個問題。紅寶石哈希鍵作爲符號不起作用

預先感謝您!

1.9.3-p194 :002 > json_sample = "{\"this\":\"notworking\"}"
=> "{\"this\":\"notworking\"}"
1.9.3-p194 :003 > test_hash = JSON.parse json_sample
=> {"this"=>"notworking"}
1.9.3-p194 :004 > test_hash["this"]
=> "notworking"
1.9.3-p194 :005 > test_hash[:this]
=> nil

回答

11

作爲JavaScript的一個子集,JSON沒有符號的概念。所有密鑰都是字符串 - 因此,當您使用Ruby解析JSON時,將使用字符串作爲密鑰創建哈希。

如果你習慣使用Ruby on Rails的工作,你可能被用來與HashWithIndifferentAccess ES,它允許你使用任何字符串你的鑰匙符號工作。


[更新]作爲在評論中提到的akuhn,您可以強制JSON模塊通過傳遞symbolize_names: true的選項JSON.parse象徵所有鍵:

JSON.parse(json_string, symbolize_names: true) 

這將使鍵符號,這意味着在訪問散列時不能使用字符串作爲鍵。

+0

感謝。 Perl和Ruby之間經歷了漫長的一天切換。有時我會想象Ruby具有它實際上沒有的功能。 –

+4

或者使用'JSON.parse(input,:symbolize_names => true)'。 – akuhn

4

你可以告訴JSON象徵所有名稱

data = JSON.parse(input, :symbolize_names => true) 
+1

啊,優秀的提示。謝謝! –