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')

キーが存在する場合は、true/falseの値が返されます。

データをシードしようとしてキーが存在しない場合、エラーがスローされ、シードが停止します。

私の質問:「username」キーが存在するかどうかを確認するにはどうすればよいですか。たとえば、データセットBにはユーザー名キーがなく、エラーがスローされますが、has_key()コマンドを変更して数レベル下をチェックする方法がわかりません。

助けてくれてありがとう。

4

2 に答える 2

2

この方法を回避することにしhas_key、begin / rescue/endを使用しました。

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 に答える