Ruby HTTParty-JSON到强类型对象
有没有可能让HttpParty对强类型ruby对象的GET结果进行反序列化?比如说Ruby HTTParty-JSON到强类型对象,ruby,httparty,Ruby,Httparty,有没有可能让HttpParty对强类型ruby对象的GET结果进行反序列化?比如说 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
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,而不是通过安装额外的gems
编辑:
我还是Ruby新手,但我记得类字段都是私有的,所以需要通过getter/setter方法访问它们。所以,也许这个问题是无效的?如果您只是想要方法语法,可以使用开放结构
require 'httparty'
require 'ostruct'
result = HTTParty.get 'http://api.stackoverflow.com/1.0/questions?tags=HTTParty'
object = OpenStruct.new result
object.total # => 2634237
一个可能的缺点是,这个对象是完全开放的,如果您在它上面调用一个不存在的方法,它将只返回nil(如果您调用setter,它将同时创建setter和getter)如果您只是想要方法语法,您可以使用一个开放结构
require 'httparty'
require 'ostruct'
result = HTTParty.get 'http://api.stackoverflow.com/1.0/questions?tags=HTTParty'
object = OpenStruct.new result
object.total # => 2634237
一个可能的缺点是,这个对象是完全开放的,如果您在它上面调用一个不存在的方法,它将只返回nil(如果您调用setter,它将同时创建setter和getter)听起来好像您希望
Myclass::get
的返回值是Myclass
的一个实例。如果是这种情况,您可以缓存HTTP请求的返回值,并实现method\u 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
也许你可以把这个答案和Joshua Creek的答案结合起来,利用OpenStruct
我还应该指出,如果您的方法不必命名为
get
,那么所有的方法别名技巧都是不必要的。听起来,您希望Myclass::get
的返回值是Myclass
的一个实例。如果是这种情况,您可以缓存HTTP请求的返回值,并实现method\u 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
也许你可以把这个答案和Joshua Creek的答案结合起来,利用OpenStruct
我还应该指出,如果您的方法不必命名为
get
,那么所有的方法别名技巧都是不必要的,您将从get请求中获得的都是文本。如果该文本表示一个序列化的ruby对象,那么您可以取消序列化并获得一个ruby对象。这就是您要寻找的吗?GET返回的是json,但HTTParty将其反序列化为哈希,但我希望json反序列化为强类型对象。这里的关键字是反序列化,我没有把它放在问题中。从get请求中得到的只是文本。如果该文本表示一个序列化的ruby对象,那么您可以取消序列化并获得一个ruby对象。这就是您要寻找的吗?GET返回的是json,但HTTParty将其反序列化为哈希,但我希望json反序列化为强类型对象。这里的关键字是反序列化,我没有把它放在问题中。