如何使用HTTParty获取和显示JSON?

时间:2013-12-07 23:49:16

标签: ruby-on-rails ruby json

我是Ruby on Rails和编程的新手。到目前为止,我已成功使用我的控制台从A​​PI返回JSON数据,但我似乎无法使其在我的本地服务器上运行。

在我输入的控制台中:

httparty "http://rubygems.org/api/v1/versions/httparty.json" 

在我设法安装/配置所有内容后它返回了JSON。

然后在控制台中写道:

rails new Catalog
rails generate controller new index

我按照教程在我去的时候让<h1>Hello, Rails!</h1>显示在我的页面上:

http://localhost:3000/

现在我正在尝试返回JSON数据,并在同一页面上显示“Hello,Rails”。

在index.html.erb中我有:

<h1>Hello, Rails</h1>
<%= @result %>

在home_controller.rb中我有:

class HomeController < ApplicationController
  def get_catalog
  include HTTParty
  @result = HTTParty.get("http://rubygems.org/api/v1/versions/httparty.json")
  end
end

在routes.rb中我有:

Catalog::Application.routes.draw do
  get "home/index"
  root :to => 'home#index'
end

当我转到页面时,“Hello,Rails”下面没有任何内容。

我仍然试图围绕所有这些东西如何相互作用。也许有人能看到我在这里做错了吗?

---更新 我正在尝试将产品名称输出到li元素中。我的文件现在是:

index.html.erb:

<ul>
  <% @http_party_json.each do |event| %>
      <% event.each do |e| %>
          <li><%=h e['Products']['Name'] %></li>
      <% end %>
  <% end %>
</ul>

控制器:

class HomeController < ApplicationController
  def index
    @response =     HTTParty.get("myURL")
    @http_party_json = JSON.parse(@response.body)
  end
end

我得到的错误是:

undefined method `[]' for nil:NilClass
Extracted source (around line #5):

2: <ul>
3:   <% @http_party_json.each do |event| %>
4:       <% event.each do |e| %>
5:           <li><%=h e['Products']['Name'] %></li>
6:       <% end %>
7:   <% end %>
8: </ul>

当我取消['Name']时,我从JSON开始:

[{"Name"=>"3x4 Vinyl Magnet", "Description"=>"Made of durable high-gloss vinyl.  Measures 3x4 inches and has rounded corners. Waterproof and scratch resistant."

为什么我无法定位['Name']来获取产品名称?

2 个答案:

答案 0 :(得分:6)

HTTParty为您解析XML / JSON响应。只需使用parsed_response即可获得它:

@response = HTTParty.get("URL").parsed_response

答案 1 :(得分:3)

HTTParty.get返回HTTParty::Response类型的对象,该对象记录在HTTParty中(查看示例。)

HTTParty::Response上有一个名为`#parsed_response的好助手方法。这将返回解析为哈希或数组的JSON字符串:

HTTParty.get("URL").parsed_response

或者,为了获取此消息的正文,您可以致电@result.body。这将返回一个字符串,您可以像以前一样安全地输出到您的页面。但是,我猜你想用它做更多的事情,而不仅仅是把它输出到一个页面。

为了将其解析为hash /数组,您可以使用/操作/返回真正的JSON,您可以执行以下操作:

http_party_json = JSON.parse(@response.body)

因此,如果您希望能够返回JSON,您可以在控制器中执行以下操作:

@response = HTTParty.get("http://rubygems.org/api/v1/versions/httparty.json").parsed_response
respond_to do |format|
   format.json { render :json => JSON.parse(@result) }
   format.html { render "index.html.erb" }
end

根据您的最新信息更新了答案:

似乎e['Products']返回一个数组(注意外面的方括号。)所以,如果你只想要一个你可以做的:

e['Products'][0]['Name'] 

如果它可能会返回多个产品,您可能需要考虑许多产品的可能性并使用each块:

e['Products'].each do |product|
    #do something with product['Name']
end

这取决于您对该应用的需求。