2012-02-09 111 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)