【问题标题】:How to convert nested string hash to symbol hash using Ruby?如何使用 Ruby 将嵌套字符串散列转换为符号散列?
【发布时间】:2017-07-08 18:29:24
【问题描述】:

服务器正在使用返回嵌套数据结构的 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]

【问题讨论】:

  • deep_symbolize_keys - 正是为了这些目的;)
  • @AndreyDeineko,这是给rails的。问题是ruby

标签: ruby


【解决方案1】:

随便用

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

【讨论】:

  • 我试过symbolize_keys,它只代表一级键
  • @LiXinyang 您是否尝试将JSON.parse 的参数传递给symbolize_keys?
  • 谢谢,deep_symolize_keys 完成了这项工作。想知道是否有纯 Ruby 解决方案。
  • 根据这个答案stackoverflow.com/questions/24927653/…,您可以使用JSON.parse 上的symbolize_names 参数来执行此操作,如果您包含json,我想那是纯Ruby?
猜你喜欢
  • 1970-01-01
  • 2012-03-27
  • 2015-01-21
  • 2018-02-10
  • 2014-06-24
  • 2013-04-21
  • 2016-02-08
  • 1970-01-01
  • 2010-12-21
相关资源
最近更新 更多