首页 > 解决方案 > 将json反序列化为rails 5中的对象

问题描述

好的,所以我正在使用 http 派对让我从 json 示例中获取详细信息

我的问题我通常如何将其反序列化为允许在我的视图中使用的对象,因此我创建了一个名为 fetchjson.rb 的控制器我的问题是如何将其链接到我的视图以及如何获取模型对里亚尔有效 5

require 'httparty'
# Use the class methods to get down to business quickly
response = HTTParty.get('http://api.stackexchange.com/2.2/questions?site=stackoverflow')

puts response.body, response.code, response.message, response.headers.inspect

# Or wrap things up in your own class
class StackExchange
  include HTTParty
  base_uri 'api.stackexchange.com'

  def initialize(service, page)
    @options = { query: { site: service, page: page } }
  end

  def questions
    self.class.get("/2.2/questions", @options)
  end

  def users
    self.class.get("/2.2/users", @options)
  end
end

stack_exchange = StackExchange.new("stackoverflow", 1)
puts stack_exchange.questions
puts stack_exchange.users

我在这里看到它已将其放入对象属性中,但是我如何将其传递给我的视图以在页面中使用。

我在我的真实世界中使用了这个示例,我正在使用诸如经度和纬度之类的字段以及在地图上放置图钉。我已经有了地图,我只需要不需要如何访问视图上的堆栈交换对象。

标签: ruby-on-railsrubyruby-on-rails-5

解决方案


将数据从控制器暴露给视图的最简单和最直接的方法,就像您对任何其他对象一样:实例变量。

class QuestionsController < ApplicationController
  def index
    stack_exchange = StackExchange.new("stackoverflow", 1)
    @questions = stack_exchange.questions
  end 
end 

HTTParty有一个parsed_response你可以调用的方法,它会尝试根据接收到的标头解析响应——如果是 XML,它会尝试将其解析为 XML。如果是 json,它会尝试将其解析为 JSON。然后,您将获得一个可以使用的对象:大概是一个 JSON-ish(数组或散列)对象。如果您需要自己查看响应,只需调用@questions.response.body- 或挖掘可用的方法@questions.methods

我们可以通过点击来解决这个问题@questions.parsed_response.class,它可能会返回哈希或数组(可能是哈希)。假设它是一个哈希,您可以@questions.parsed_response.keys获取可用于访问值的键。如果它是一个数组(同样,可能是散列),@questions.parsed_response.first.keys


推荐阅读