我正在尝试从其他域获取JSON数据。我用了这段代码:
class EMPInfoController < ApplicationController
require 'httparty'
def empdata
uri = HTTParty.get("http://www.somesite.com/jsondata/xyz")
resp = JSON.parse(uri.body)
@empdata = resp
end
end
我能够将JSON数据解析为resp
但是当我将其推送到@empdata
并尝试使用JavaScript时,它似乎找不到正确的键/哈希。
有没有办法解剖JSON哈希并获取输出?
JSON Data - resp
{
"empid123456": {
"first_name": "john",
"last_name": "doe",
"title": "mr",
"age": "32",
"blood_group": "B+"
}
}
我可以通过将其移至@EmpData
并使用@EmpData[:first_name]
稍后在视野中进行检索来获取它吗?
我是Rails的新手,需要对项目的每一步都有一些指导。
答案 0 :(得分:0)
将您的JSON数据包装在Ruby类中,并将其作为app/models/json_data.rb
放在“models”目录中:
class JsonData
attr_reader :emp
def initialize(attributes)
@emp = attributes[:emp]
end
def self.from_json(json_string)
parsed = JSON.parse(json_string)
emp = Emp.new(parsed['empid123456'])
new(:emp => emp)
end
end
为emp
创建一个Active Model类,并将其放在app/models/emp.rb
:
class Emp
include ActiveModel::Serializers::JSON
include ActiveModel::Validations
ATTRIBUTES = [:first_name, :last_name, :title, :age, :blood_group]
attr_accessor *ATTRIBUTES
###add your activemodel validations here ###
def initialize(attributes = {})
self.attributes = attributes
end
def attributes
ATTRIBUTES.inject(
ActiveSupport::HashWithIndifferentAccess.new
) do |result, key|
result[key] = read_attribute_for_validation(key)
result
end
end
def attributes= (attrs)
attrs.each_pair {|k, v| send("#{k}=", v)}
end
def read_attribute_for_validation(key)
send(key)
end
end
在您的控制器中,您现在可以执行此操作:
def empdata
uri = HTTParty.get("http://www.somesite.com/jsondata/xyz")
@empdata = JsonData.from_json(uri.body)
end
在您的视图中,您可以使用:
@empdata.first_name
@empdata.last_name
检索相应的值。
答案 1 :(得分:0)
找到了解决方案..谢谢@pette
@first_name = []
@last_name = []
@title = []
@age = []
@blood_group = []
thixjs = "#{emp}.json"
resp.each do |key_category, group_category|
group_category.each do |key,val|
if group_category.is_a? Array
eval("@#{key}") << val
elsif group_category.is_a? Hash
if key == thixjs
else
eval("@#{key}") << val
end
end
end
end
然而,这需要时间来解决,但现在它会这样做。
再次感谢。