0

我需要从我从路边提供的 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
    }
}
4

1 回答 1

1

请注意,在 Rails 中访问哈希元素在模型中有效。要在哈希上使用它,您必须使用OpenStruct对象。它是 rails 标准库的一部分。考虑到,@foobar 已经像你一样解码了 JSON。

obj = OpenStruct.new(@foobar)
obj.data
#=> Hash

但是,请注意, obj.data.catalog_items 将不起作用,因为这是一个哈希,同样不是 OpenStruct 对象。为了帮助这一点,我们有recursive-open-struct,它将为您完成这项工作。

替代解决方案 [1]:

@foobar[:data]['catalog_items'].first['current_price']

但是,丑。

替代解决方案 [2]:

公开Hash课,使用method_missing能力为:

class Hash
  def method_missing(key)
    self[key.to_s]
  end
end

希望能帮助到你。:)

于 2013-04-28T09:40:35.017 回答