2017-02-19 143 views
2

服務器正在使用返回嵌套數據結構的JSON API。我試圖用JSON.parse解析它,但默認情況下它將json字符串轉換爲字符串哈希。如何使用Ruby將嵌套字符串散列轉換爲符號散列?

樣本數據

{ 
    "data"=> 
    { 
    "id"=>"1", 
    "type"=>"users", 
    "attributes"=> 
    { 
     "email"=>"[email protected]", 
     "name"=>"Tanner Kreiger" 
    } 
    } 
} 

我在下面試圖代碼,但它只能轉換

def json_body 
    str_hash = JSON.parse(response.body) 
    str_hash.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} 
    end 

我也試圖從Rails的symbolize_keys只轉換爲單級(不是孩子哈希)第一級也是如此(參見:data和其餘部分是相同的),

{:data=>{"id"=>"1", "type"=>"users", "attributes"=>{"email"=>"[email protected]", "name"=>"Cleo Braun"}}} 

將嵌套字符串散列遞歸轉換爲符號散列的最佳方法是什麼?

所需的結果

所有值可以使用符號,像json_response[:data][:attributes]是訪問。

+1

有['deep_symbolize_keys'(http://api.rubyonrails.org/classes/Hash.html#method-i-deep_symbolize_keys) - 正是爲了這些目的;) –

回答

2

只需使用

JSON.parse(result, symbolize_keys: true) 

更多信息http://apidock.com/ruby/JSON/parse

或散列本身

hash = { 'name' => 'Rob', 'age' => '28' } 

hash.symbolize_keys 
# => {:name=>"Rob", :age=>"28"} 

http://apidock.com/rails/Hash/symbolize_keys

這些似乎並沒有做到這一點遞歸雖然。

還有deep_symbolize_keys! Rails中

http://api.rubyonrails.org/classes/Hash.html#method-i-deep_symbolize_keys

+0

我已經嘗試過'symbolize_keys',它只象徵一級關鍵 –

+0

@LiXinyang你嘗試給'JSON.parse'參數給symbolize_keys嗎? – Coolness

+0

謝謝,'deep_symolize_keys'完成這項工作。想知道是否有純粹的Ruby解決方案。 –