从哈希中提取值

时间:2012-03-21 23:40:52

标签: ruby linux json hash httparty

你好我使用HTTParty来调用一个远程json文件,我需要提取我要在我的一个测试中使用的URL。 json格式如下:

  "manifest" : {
    "header" : {
      "generated" : "xxxxxxxxxxxxxxx",
      "name" : "xxxxxxxxxxx",
      "version" : "1.0.0"
    },
    "files" : [ {
      "file" : "blimp.zip",
      "url" : "http://www.xxx.xx/restaurants_blimp.zip",
      "checksum" : "ee98c9455b8d7ba6556f53256f95"
    }, {
      "file" : "yard.zip",
      "url" : "www.xxx.xx/yard.zip",
      "checksum" : "e66aa3d123f804f34afc622b5"
    }

on irb我可以获得示例中的所有子哈希:['manifest'] ['files']如果我指定哪一个,我只能获取url ...例如puts file ['manifest'] [ 'files'] ['1'] ['url']< - 这对irb有效但是因为我需要获取所有url这就是为什么我使用.each但是它让我无法转换为字符串错误或类似

#!/usr/bin/env ruby

require 'httparty'

HOST=ARGV[0]
ID=ARGV[1]
VERSION=ARGV[2]


class MyApi
  include HTTParty
end

file = MyApi.get("http://#{HOST}/v1/dc/manifest/#{ID}/#{VERSION}")


file.each do |item|
 puts item['manifest']['files']['url']
end

没有工作,但我可以在IRB上做:

把item ['manifest'] ['files'] [2] ['url']&lt; - 这会给我一个url但是.each会抱怨转换为字符串或类似的< / p>

2 个答案:

答案 0 :(得分:3)

尝试以下方法:

#!/usr/bin/env ruby

require 'httparty'

(HOST, ID, VERSION) = ARGV

class MyApi
  include HTTParty
  format :json
end

response = MyApi.get("http://#{HOST}/v1/dc/manifest/#{ID}/#{VERSION}")

puts response.inspect

添加format :json告诉HTTParty将响应解析为JSON。然后你会得到一个可以正确迭代的哈希值。

答案 1 :(得分:2)

尝试:

file['manifest']['files'].each do |item|
   puts item['url']
end