【问题标题】:Accessing JSON objects in Ruby [closed]在 Ruby 中访问 JSON 对象 [关闭]
【发布时间】:2015-04-28 22:41:31
【问题描述】:

我有一个看起来像这样的 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 的新手来说有什么好的资源?

【问题讨论】:

  • 这个 json =JSON.parse(File.read('input.json')) 将从 json 创建哈希。
  • 啊。我正在尝试为每个客户文件创建 json 文件,然后只访问某些值(例如 module.names)。 json是怎么做到的?
  • 我已经创建了 json 文件。现在我尝试只访问每个 json 文件中的 module.name。
  • 欢迎来到 Stack Overflow。将您的 JSON 减少到演示您想要做什么所需的最低限度。除此之外的任何事情都会使问题变得混乱,并使我们更难为您提供帮助。您的 JSON 示例也无效,因为有弯引号和缺少打开的 {。 JSON 有据可查,因为它是一个标准。 Ruby 教程在互联网上比比皆是。搜索任何一个都会出现很多信息。对于 Stack Overflow 来说,两者中的任何一个都要求教程是题外话。

标签: ruby-on-rails ruby json


【解决方案1】:

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?

【讨论】:

  • 附带说明:您的 JSON 示例看起来无效 - 键 Text1Modules 周围的引号是错误的。
  • Modules和module有什么区别? (假设模块来自我的 json 文件)。
  • :Modulespath 哈希中的一个键。 module 迭代时包含当前项的块变量 path[:Modules].each
【解决方案2】:

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

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

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

require 'ostruct'
JSON.parse(File.read('input.json'), object_class: OpenStruct)

【讨论】:

  • 这似乎是一种非常混乱的方式:JSON.parse(File.read('input.json'), object_class: OpenStruct)
  • 更喜欢你的并编辑了我的...谢谢分享!
  • 还有 json["Results"] 和 "Paths" 是数组。所以你不能像你的例子那样访问它们——你需要遍历它们。
  • 有效,但仅在 ruby​​ 2.x 中有效,其他示例请参见 coderwall.com/p/74rajw/…
【解决方案3】:

你可以试试:

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

【讨论】:

  • 不行,你需要解析JSON文件,而不仅仅是读取它的内容。
  • @papirtiger 忘记了,谢谢指出。
猜你喜欢
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
相关资源
最近更新 更多