2

我有一组具有多级数据的 JSON 数据。JSON 的片段(请忽略缺少的格式):

DATA SET A:
"interaction": {
   "author": {
      "username": "johndoe",
      "name": "John Doe"
   }
},
"gender": "male"

DATA SET B:
"interaction": {
   "author": {
      "name": "Jane Doe"
   }
},
"gender": "male"

在单级中,我可以使用:

if record.has_key?('gender')

如果密钥存在,它将返回一个真/假值。

如果我尝试播种数据并且密钥不存在,它将引发错误并停止播种。

我的问题:我将如何检查“用户名”键是否存在。例如,数据集 B 没有用户名键并且会引发错误,但我不知道如何修改 has_key() 命令以检查向下的几个级别。

谢谢您的帮助。

4

2 回答 2

2

我决定解决该has_key方法并使用开始/救援/结束。

begin
  @data.username = record['interaction']['author']['username']
rescue
  @data.username = nil
end
于 2012-08-30T15:10:56.350 回答
0

这是一种可能性:

# where a and b are loaded from JSON
a = {
  'interaction' => {
    'author' => {
      'username' => 'johndoe',
      'name' => 'jd'
    }
  }
}
b = {
  'interaction' => {
    'author' => {
      'oijoijoij' => 'johndoe',
      'name' => 'jd'
    }
  }
}
class Hash
  def recursive_has_key?(key)
    has_key?(key) or values.any? { |v| v.is_a?(Hash) and v.recursive_has_key?(key) }
  end
end
puts a.recursive_has_key?('username')
puts b.recursive_has_key?('username')

哪个输出

$ ruby foo.rb 
true
false
于 2012-08-24T16:21:10.383 回答