2010-08-26 253 views
3

我希望能够自动将JSON对象解析为实例变量。例如,用这个JSON。自动将JSON对象映射到Ruby中的实例变量

require 'httparty' 

json = HTTParty.get('http://api.dribbble.com/players/simplebits') #=> {"shots_count":150,"twitter_screen_name":"simplebits","avatar_url":"http://dribbble.com/system/users/1/avatars/thumb/dancederholm-peek.jpg?1261060245","name":"Dan Cederholm","created_at":"2009/07/07 21:51:22 -0400","location":"Salem, MA","following_count":391,"url":"http://dribbble.com/players/simplebits","draftees_count":104,"id":1,"drafted_by_player_id":null,"followers_count":2214} 

我希望能够做到这一点:

json.shots_count 

而且有它的输出:

150 

我怎么可能做到这一点?

回答

5

你绝对应该使用类似json["shots_counts"],但如果你真的需要物化哈希,你可以为此创建新类:

class ObjectifiedHash 

    def initialize hash 
     @data = hash.inject({}) do |data, (key,value)| 
      value = ObjectifiedHash.new value if value.kind_of? Hash 
      data[key.to_s] = value 
      data 
     end 
    end 

    def method_missing key 
     if @data.key? key.to_s 
      @data[key.to_s] 
     else 
      nil 
     end 
    end 

end 

之后,使用它:

ojson = ObjectifiedHash.new(HTTParty.get('http://api.dribbble.com/players/simplebits')) 
ojson.shots_counts # => 150 
+1

这看起来像是一个'OpenStruct'的递归实现。这个想法还有其他的实现,包括[recursive-open-struct gem](https://rubygems.org/gems/recursive-open-struct)。 – 2012-04-16 20:51:00

2

很好,能得到你想要的东西是很难的,但越来越接近很简单:

require 'json' 

json = JSON.parse(your_http_body) 
puts json['shots_count'] 
+0

这一工程, 谢谢。 – 2010-08-26 15:58:10

+0

HTTPARTy不需要JSON.parse - HTTParty使用破解库来解析JSON。 – Brian 2010-08-26 16:11:38

+0

截至2012年4月,它使用'multi_json',但效果相同。另外,如果你请求'/ something.json',它会自动解析为JSON。 – 2012-04-16 20:48:27

0

不正是你所寻找的,但是这将让你更接近:

ruby-1.9.2-head > require 'rubygems' 
=> false 
ruby-1.9.2-head > require 'httparty' 
=> true 
ruby-1.9.2-head > json = HTTParty.get('http://api.dribbble.com/players/simplebits').parsed_response 
=> {"shots_count"=>150, "twitter_screen_name"=>"simplebits", "avatar_url"=>"http://dribbble.com/system/users/1/avatars/thumb/dancederholm-peek.jpg?1261060245", "name"=>"Dan Cederholm", "created_at"=>"2009/07/07 21:51:22 -0400", "location"=>"Salem, MA", "following_count"=>391, "url"=>"http://dribbble.com/players/simplebits", "draftees_count"=>104, "id"=>1, "drafted_by_player_id"=>nil, "followers_count"=>2214} 
ruby-1.9.2-head > puts json["shots_count"] 
150 
=> nil 

希望这帮助!