如何编码的JSON解析器中的对象提供的所有信息?

时间:2019-02-02 17:45:25

标签: ruby-on-rails ruby rubygems whois whois-ruby

我对红宝石和铁轨很陌生。我试图输出解析出的所有WHOIS信息以JSON输出。我有以下内容:

class WhoisController < ApplicationController
  def index
    c = Whois::Client.new
    record = c.lookup("google.com")
    parser = record.parser
    created = parser.created_on
    msg = {:created => created}
    render :json => msg
  end
end

输出:

{"created":"1997-09-15T00:00:00.000-07:00"}

但是,解析器有很多可用的信息。...在不知道所有可用字段的情况下,如何将所有键/值转储到json?

我尝试过:

class WhoisController < ApplicationController
  def index
    c = Whois::Client.new
    record = c.lookup("google.com")
    parser = record.parser
    msg = {:whois => parser}
    render :json => msg
  end
end

但最终得到:

SystemStackError in WhoisController#index

编辑:

我也尝试过:

parser.attributes.each do |attr_name, attr_value|
  puts attr_name
end

但是最终会收到另一个错误:

undefined method `attributes' for #<Whois::Parser:0x00007fc030d74018>

Python和Go(通过反射)都可以做到这一点。 Ruby实现此目的的方法是什么?

编辑:

class WhoisController < ApplicationController
    def index
        c = Whois::Client.new
        record = c.lookup("google.com")
        parser = record.parser
        msg = {}
        for x_prop in Whois::Parser::PROPERTIES
            msg[x_prop] = parser.send(x_prop)
        end
        render :json => msg
    end
end

此工作仅当解析器存在的所有属性。但是,某些域名不具有所有属性,因此会导致:

Unable to find a parser for property `registrant_contacts'

然后我尝试仅在该属性存在的情况下进行设置:

msg = {}
for x_prop in Whois::Parser::PROPERTIES
  parser.has_attribute?(:x_prop) 
    msg[x_prop] = parser.send(x_prop) 
end
render :json => msg

我遇到另一个错误:

undefined method `has_attribute?'

编辑#3:

我也尝试过:

msg = {}
for prop in Whois::Parser::PROPERTIES
  msg[prop] = parser.send(prop) if parser.respond_to?(prop)
end
render :json => msg

如果解析器中缺少该属性,此操作仍将失败。 ;(

3 个答案:

答案 0 :(得分:1)

class WhoisController < ApplicationController
    def index
        c = Whois::Client.new
        record = c.lookup("google.com")
        parser = record.parser
        msg = {}
        for x_prop in Whois::Parser::PROPERTIES
            msg[x_prop] = parser.send(x_prop)
        end
        render :json => msg
    end
end

在少数情况下,某些属性可以为空并导致错误,以免发生这种情况:

begin
    msg[x_prop] = parser.send(x_prop)
rescue
    # do nothing
end

答案 1 :(得分:0)

对于SystemStackError in WhoisController#index

我认为这是因为您再次通过whois与Whois呼叫record = Whois.whois("google.com")。尝试record = whois("google.com")

对于undefined method `attributes' for #<Whois::Parser:0x00007fc030d74018>: 对于whois解析器,attributes方法不会退出。 参见https://whoisrb.org/docs/v3/parser-properties/

答案 2 :(得分:-2)

您可以使用methodsinspect

    c = Whois::Client.new
    record = c.lookup("google.com")
    parser = record.parser
    render json: parser.methods.to_json
    render json: parser.inspect.to_json