0

HTTPartyにGETからの結果を強く型付けされたrubyオブジェクトに逆シリアル化させることは可能ですか?例えば

class Myclass
 include HTTParty

end

x = Myclass.get('http://api.stackoverflow.com/1.0/questions?tags=HTTParty')

puts x.total
puts x.questions[0].title

今はそれをハッシュに逆シリアル化します

puts x["total"]

私の質問は、HTTPartyが追加のgemをインストールするのではなく、このOTBをサポートするかどうかです。

編集

私はまだRubyを初めて使用しますが、クラスフィールドはすべてプライベートであるため、getter/setterメソッドを介してアクセスする必要があることを思い出します。それで、多分この質問は有効なものではありませんか?

4

2 に答える 2

2

メソッド構文だけが必要な場合は、open構造体を使用できます。

require 'httparty'
require 'ostruct'

result = HTTParty.get 'http://api.stackoverflow.com/1.0/questions?tags=HTTParty'
object = OpenStruct.new result
object.total # => 2634237

考えられる欠点は、このオブジェクトが完全に開いているため、存在しないメソッドを呼び出すと、nilが返されるだけです(セッターを呼び出すと、セッターとゲッターの両方が作成されます)

于 2012-02-10T00:32:17.390 に答える
1

Myclass::getの戻り値をのインスタンスにしたいようですMyclass。その場合は、HTTPリクエストからの戻り値をキャッシュし、method_missingそのハッシュから値を返すように実装できます。

class Myclass
  include HTTParty

  attr_accessor :retrieved_values

  def method_missing(method, *args, &block)
    if retrieved_values.key?(method)
      retrieved_values[method]
    else
      super
    end
  end

  def self.get_with_massaging(url)
    new.tap do |instance|
      instance.retrieved_values = get_without_massaging(url)
    end
  end

  class << self
    alias_method :get_without_massaging, :get
    alias_method :get, :get_with_massaging
  end
end

これは、1レベルの深さでしか機能しないため、正確には要求したものではありません。つまりx.questions[0].titlex.questions[0][:title]

x = Myclass.get('http://api.stackoverflow.com/1.0/questions?tags=HTTParty')
p x.total
p x.questions[0][:title]

おそらく、OpenStructを利用するために、この回答とJoshuaCreekの回答のハイブリッドを思い付くことができます。

また、メソッドに名前を付ける必要がない場合は、メソッドエイリアシングのトリックはすべて必要ないことも指摘しておく必要がありますget

于 2012-02-10T01:34:05.910 に答える