Как мне json кодировать всю информацию, доступную в объекте парсера? - PullRequest
0 голосов
/ 02 февраля 2019

Я очень новичок в рубине и рельсах.Я пытаюсь вывести всю проанализированную информацию 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 голосов
/ 03 февраля 2019

Вы можете использовать methods или inspect.

    c = Whois::Client.new
    record = c.lookup("google.com")
    parser = record.parser
    render json: parser.methods.to_json
    render json: parser.inspect.to_json
0 голосов
/ 03 февраля 2019
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
0 голосов
/ 02 февраля 2019

Для SystemStackError in WhoisController#index:

Я думаю, это потому, что вы снова звоните whois с Whois на record = Whois.whois("google.com").Попробуйте record = whois("google.com").

Для undefined method `attributes' for #<Whois::Parser:0x00007fc030d74018>: метод атрибутов не завершается для анализатора whois.См https://whoisrb.org/docs/v3/parser-properties/.

...