我如何 json 对解析器对象中的所有可用信息进行编码?

How do I json encode all the info available in the parser object?

我对 ruby 和 rails 很陌生。我正在尝试将所有已解析的 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"}

但是,解析器有很多可用信息....在不知道所有可用字段的情况下,如何将所有 keys/values 转储到 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

如果解析器中缺少 属性,这仍然会失败。 ;(

对于SystemStackError in WhoisController#index

我认为这是因为您在 record = Whois.whois("google.com") 再次使用 Whois 调用 whois。试试 record = whois("google.com").

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

您可以使用 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
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