【问题标题】:Can I clean up this overly nested JSON with Ruby?我可以用 Ruby 清理这个过度嵌套的 JSON 吗?
【发布时间】:2012-09-21 05:24:06
【问题描述】:

我有以下变量(从 JSON 对象解析)

testdata = {
 "file_data"=>[
  {"id"=>"idvalue","desc"=>[
   {"key"=>"value"}
  ]}
 ]
}

文件数据只有一个,但不是以散列开头,而是将其散列封装在一个数组中。但这种疯狂并没有就此结束:desc 键应该包含一个散列,而是包含一个单对象数组,其中包含一个散列。

所以要获取任何数据,我必须编写类似的东西

puts testdata["file_data"][0]["desc"][0]["key"]

我能做些什么来处理这种多余的嵌套?

【问题讨论】:

  • 为什么不使用上面的建议?
  • 除了丑陋之外,这种多余的包装还使得使用 Hashie::Mash 之类的东西变得更加困难。

标签: ruby arrays hashtable


【解决方案1】:

你可以这样做:

def clean h
  Hash[h.map{|k,v|
    [k,
     case v 
       when Hash then clean(v)  
       when Array then clean(v.first)  
       else v 
     end
    ]
  }]    
end  

clean testdata
#=> {"file_data"=>{"id"=>"idvalue", "desc"=>{"key"=>"value"}}}

【讨论】:

  • 当然递归清理方法是我的想法,但是如果数据包含具有实际值的数组怎么办?示例:{"file_data"=>[{"id"=>"idvalue","desc"=>[{"key"=>[1,2]}]}]} 在这种情况下,这段特殊的代码会引发错误。
  • 你必须更准确地定义在这种情况下应该发生什么。
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2023-02-01
  • 2011-05-05
相关资源
最近更新 更多