用Ruby搜索JSON对象以查找关键字



尝试从这个相对复杂的JSON对象返回字符串"image-2016-05-05+19%3A13%3A49.058890.jpg"

{
  "Type": "Notification",
  "MessageId": "e3a008de-7053-530e-b2b4-4778704d30a0",
  "TopicArn": "arn:aws:sns:us-west-2:xxxx:xxxx",
  "Subject": "Amazon S3 Notification",
  "Message": "{"Records":[{"eventVersion":"2.0","eventSource":"aws:s3","awsRegion":"us-west-2","eventTime":"2016-05-06T02:13:50.030Z","eventName":"ObjectCreated:Put","userIdentity":{"principalId":"AWS:AIDAIZ6VOIJWE82389JSE"},"requestParameters":{"sourceIPAddress":"0.0.0.0"},"responseElements":{"x-amz-request-id":"F819FA912DBD16","x-amz-id-2":"7oOWHPhWsgjBW6XSj8DiSj8Sj8801LKJn5NLRn8JmYsNxJXKWqlkjDFL092zHuWYZn7pIKcRwX6g="},"s3":{"s3SchemaVersion":"1.0","configurationId":"image-notification","bucket":{"name":"project","ownerIdentity":{"principalId":"A17D10FQZ"},"arn":"arn:aws:s3:::project"},"object":{"key":"image-2016-05-05+19%3A13%3A49.058890.jpg","size":54098,"eTag":"fbc4bakjf8asdj8f890ece3474c55974927c","sequencer":"00572LKJDF389238CA7B04BD"}}}]}",
  "Timestamp": "2016-05-06T02:13:50.126Z",
  "SignatureVersion": "1",
  "Signature": "Lao5PoEchryYf1slxxxlyI0GB2Xrv03VFC+4JVlji0y1El+rQGL837PYRHdj2m/dGD9/ynJxPhIBWcoJxX4D7MBsNqaZXilqJtjp+t8Rku0avErgWQVQG+rjZcdVbSU12DI/Ku0v9LhYg2/Js+ofYGPZH9U4C+Jfup5wjgHXah4BGNmF3TO+oq08Y56edhMxV25URDcU+z5aaVW2sK2tlnynSNzLuAF5TlKuuLmYr3Buci83FkU46l6Bz/ENba1BlGGqT8P+ljdf9092z+iP42T9qUzj1HL9p9SjEDIam/03n1039JS01gbPpgdo6/2Z6kZK3LvrVRBzI0voFitLg==",
  "SigningCertURL": "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-bbxxx750dd426323fafd95ee9390147a5624348ee.pem",
  "UnsubscribeURL": "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:332531341234:xxxx:0e43fsSDF40e-d4a7-46c0-95ab-4fd11739267b"
}

无需这样做:

@key = JSON.parse(@request[:Message])["Records"][0]["s3"]["object"]["key"]

有没有一种方法可以解析和搜索这个JSON对象,通过提供诸如"image"之类的关键字来返回前面提到的字符串?

您可以使用hashie deepLocate

request = JSON.parse(@request)
request.extend(Hashie::Extensions::DeepLocate)
request.deep_locate -> (key, value, object) { key == :key && value.include?("image") }
#=> { :key => "image-2016-05-05+19%3A13%3A49.058890.jpg" }

除了使用值进行搜索外,如果您知道密钥,还可以这样做来查找该密钥的深度嵌套值。

def nested_hash_value(obj,key)
  if obj.respond_to?(:key?) && obj.key?(key)
    obj[key]
  elsif obj.respond_to?(:each)
    r = nil
    obj.find{ |*a| r=nested_hash_value(a.last,key) }
    r
  end
end

p nested_hash_value(JSON.parse(@request),:key)
#=> image-2016-05-05+19%3A13%3A49.058890.jpg

最新更新