2010-08-26 1 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. Существуют и другие реализации этой идеи, в том числе [рекурсивная открытая структура gem] (https://rubygems.org/gems/recursive-open-struct). –

2

Ну, получить то, что вы хотите, трудно, но приближается легко:

require 'json' 

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

Это работает , благодаря. –

+0

JSON.parse не требуется для HTTParty - HTTParty использует библиотеку трещин для разбора JSON. – Brian

+0

По состоянию на апрель 2012 года он использует 'multi_json', но с тем же эффектом. Кроме того, если вы запрашиваете '/ something.json', он автоматически анализирует JSON. –

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 

Надеется, что это помогает!

Смежные вопросы