Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby HTTParty-JSON到强类型对象_Ruby_Httparty - Fatal编程技术网

Ruby HTTParty-JSON到强类型对象

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

有没有可能让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,而不是通过安装额外的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反序列化为强类型对象。这里的关键字是反序列化,我没有把它放在问题中。