在Ruby中访问JSON对象

时间:2015-04-28 22:41:31

标签: ruby-on-rails ruby json

我有一个看起来像这样的json文件:

{
  "Results": [
    {
      "Lookup": null,
      "Result": {
        "Paths": [
          {
            "Domain": "VALUE1.LTD",
            "Url": "",
            "Text1": "",
            "Modules": [
              {
                "Name": "VALUE",
                "Tag": "VALUE",
                "FirstDetected": "1111111111",
                "LastDetected": "11111111111"
              },
              {
                "Name": "VALUE",
                "Tag": "VALUE",
                "FirstDetected": "111111111111",
                "LastDetected": "11111111111111"
              }
            ]
          }
        ]
      }
    }
  ]
}

如何仅打印域并仅访问ruby中的module.names并将module.names打印到控制台:

#!/usr/bin/ruby
require 'rubygems'
require 'json'
require 'pp'

json = File.read('input.json')

并且任何人都知道ruby和json有什么好资源可供新手使用吗?

3 个答案:

答案 0 :(得分:6)

JSON.parse接受一个JSON字符串并返回一个哈希值,该哈希值可以像任何其他hash一样进行操作。

#!/usr/bin/ruby
require 'rubygems'
require 'json'
require 'pp'

# Symbolize keys makes the hash easier to work with
data = JSON.parse(File.read('input.json'), symbolize_keys: true)

# loop through :Results if there are any
data[:Results].each do |r|
  # loop through [:Result][:paths] if there are any
  r[:Result][:paths].each do |path|
    # path refers the current item
    path[:Modules].each do |module|
      # module refers to the current item
      puts module[:name]
    end if path[:Modules].any?
  end if r[:Result][:paths].any?
end if data[:Results].any?

答案 1 :(得分:3)

在Ruby中,你必须使用方括号来访问哈希。

%declare DATE `date +%s`;

然而它是Ruby ...因此您还可以使用简单的点表示法覆盖Hash类并访问Hashes。 (通过简单的解决方案:@papirtiger) 例如:domain = json.Results.Paths.Domain

json =JSON.parse(File.read('input.json'))
domains = []
json.Results.map{|result| result.Paths.map{|path| domains << path.Domain }}

答案 2 :(得分:1)

您可以尝试:

json_file = JSON.parse(File.read('input.json'))

json_file[:Results].each {|y| y[:Result][:Paths].each do |a|
  puts "Domain names: #{a[:Domain]}"
  a[:Modules].each {|b| puts "Module names are: #{b[:Name]}" }
end
}

#=> Domain names: VALUE1.LTD
#=> Module names are: VALUE
#=> Module names are: VALUE