如何使用Ruby将嵌套字符串哈希转换为符号哈希?

时间:2017-02-19 14:14:45

标签: ruby

服务器正在使用JSON API,它返回一个嵌套的数据结构。我试图使用JSON.parse解析它,但默认情况下它会将json字符串转换为字符串哈希。

示例数据

{
  "data"=>
  {
    "id"=>"1",
    "type"=>"users",
    "attributes"=>
    {
      "email"=>"tia_heller@lebsack.info",
      "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"=>"darrion_hackett@weberharvey.io", "name"=>"Cleo Braun"}}}

将嵌套字符串哈希递归转换为符号哈希的最佳方法是什么?

期望的结果

可以使用符号访问所有值,例如json_response[:data][:attributes]

1 个答案:

答案 0 :(得分:3)

只需使用

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

这些似乎并不是递归地做到的。

Rails中还有deep_symbolize_keys!

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