我希望能够自动将JSON对象解析为实例变量。例如,使用此JSON。
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
我怎么可能这样做?
答案 0 :(得分: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 :(得分:2)
好吧,得到你想要的东西很难,但接近很容易:
require 'json'
json = JSON.parse(your_http_body)
puts json['shots_count']
答案 2 :(得分: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
希望这有帮助!