我需要从我从路边服务的JSON响应中提取一些数据。
以前我没有调用symbolize_keys,但我认为这会让我的尝试工作。
控制器操作:
http = Curl.get("http://api.foobar.com/thing/thing_name/catalog_items.json?per_page=1&page=1") do|http|
http.headers['X-Api-Key'] = 'georgeBushSucks'
end
pre_keys = http.body_str
@foobar = ActiveSupport::JSON.decode(pre_keys).symbolize_keys
在视图中(获取未定义的方法`current_price')
@ foobar.current_price
我也尝试@foobar.data[0]['current_price']
使用相同的结果
来自行动的JSON回复:
{
"data": {
"catalog_items": [
{
"current_price": "9999.0",
"close_date": "2013-05-14T16:08:00-04:00",
"open_date": "2013-04-24T11:00:00-04:00",
"stuff_count": 82,
"minimum_price": "590000.0",
"id": 337478,
"estimated_price": "50000.0",
"name": "This is a really cool name",
"current_winner_id": 696969,
"images": [
{
"thumb_url": "http://foobar.com/images/93695/thumb.png?1365714300",
"detail_url": "http://foobar.com/images/93695/detail.png?1365714300",
"position": 1
},
{
"thumb_url": "http://foobar.com/images/95090/thumb.jpg?1366813823",
"detail_url": "http://foobar.com/images/95090/detail.jpg?1366813823",
"position": 2
}
]
}
]
},
"pagination": {
"per_page": 1,
"page": 1,
"total_pages": 131,
"total_objects": 131
}
}
答案 0 :(得分:1)
请注意,在Rails中访问hash的元素可以在模型中使用。要在哈希上使用它,您必须使用OpenStruct
对象。它是rails中标准库的一部分。
考虑到,@ foobar已经解码了JSON。
obj = OpenStruct.new(@foobar)
obj.data
#=> Hash
但请注意,obj.data.catalog_items不起作用,因为它是一个哈希,而且不是一个OpenStruct对象。为了解决这个问题,我们有recursive-open-struct
,它将为您完成工作。
@foobar[:data]['catalog_items'].first['current_price']
但是,丑陋。
打开Hash
课程,使用method_missing
能力:
class Hash
def method_missing(key)
self[key.to_s]
end
end
希望它有所帮助。 :)