2012-02-09 112 views
0

是否有可能使HTTParty反序列化來自GET的結果到強類型的ruby對象?例如HTTParty - JSON強類型對象

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支持該OTB,而不是通過安裝額外的寶石。

編輯

我還是新來的Ruby,但我記得,類字段都爲私有,這樣他們就需要通過getter/setter方法進行訪問。所以也許這個問題不是一個有效的問題?

+0

您將從GET請求獲得的所有內容均爲文本。如果該文本表示一個序列化的ruby對象,那麼您可以對其進行反序列化並獲得一個ruby對象。那是你在找什麼? – Nerian 2012-02-09 21:42:40

+0

從GET返回的是json,但是HTTParty將它反序列化爲一個散列,但我希望將json反序列化爲一個強類型對象。這裏的關鍵字是DESERIALIZE,我沒有提出這個問題。 – ILovePaperTowels 2012-02-09 21:51:29

回答

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 

這不正是你要的,因爲它只能一層深 - 即,x.questions[0].title將需要x.questions[0][:title]

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

也許你能想出這個答案和Joshua溪的一些混合動力採取OpenStruct的優勢。

我還應該指出,如果你的方法沒有被命名爲get,所有的方法別名欺騙是沒有必要的。

2

如果你只是想要的方法語法,你可以使用一個開放的結構。

require 'httparty' 
require 'ostruct' 

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

一個可能的缺點是,這個目標是完全開放的,例如,如果你調用一個不存在的方法就可以了,它只會返回零(如果你調用一個setter,它會創建兩個setter和getter)