Ruby on Rails和来自URL的JSON解析器
我使用’gem json’并且需要从某个url加载JSON数据,例如:
"http://locallhost:3000/qwerty/give_json.json"
{"one":"Omg","two":125,"three":"Hu"}
我有rails app
class QwertyController < ApplicationController require 'json' def get_json source = "http://localhost:3000/qwerty/give_json.json" @data = JSON.parse(JSON.load(source)) end end
我收到错误
JSON::ParserError in QwertyController#get_json 795: unexpected token at 'http://localhost:3000/qwerty/give_json.json'
在字符串中:@data = JSON.parse(JSON.load(source))
有什么事? 如何获取JSON数据并解析它? 我试试@data [“one”] ……
根据文档, JSON.load
接受一个String
或IO
对象的源
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/JSON.html#method-i-load
[17] pry(main)> {hello: "World"}.to_json => "{\"hello\":\"World\"}" [18] pry(main)> JSON.load(_) => {"hello"=>"World"}
你给它一个字符串,这是一个URL,这就是你收到错误的原因。 您可以使用open-uri
从URL获取数据,然后由JSON解析,如此…
[22] pry(main)> require 'open-uri' => false [23] pry(main)> JSON.load(open("https://api.github.com")) => {"current_user_url"=>"https://api.github.com/user", "authorizations_url"=>"https://api.github.com/authorizations", "emails_url"=>"https://api.github.com/user/emails", "emojis_url"=>"https://api.github.com/emojis", "events_url"=>"https://api.github.com/events", "feeds_url"=>"https://api.github.com/feeds", "following_url"=>"https://api.github.com/user/following{/target}", "gists_url"=>"https://api.github.com/gists{/gist_id}", "hub_url"=>"https://api.github.com/hub"}
注意
open
返回一个StringIO
对象,它响应read
返回JSON数据。 JSON.load将数据转换为要使用的哈希。
要解析JSON字符串,您可以使用JSON.load
或JSON.parse
您可以使用如下所示的net / http库:
require 'net/http' source = 'http://localhost:3000/qwerty/give_json.json' resp = Net::HTTP.get_response(URI.parse(source)) data = resp.body result = JSON.parse(data)
或gemhttp派对:
require 'httparty' response = HTTParty.get('http://localhost:3000/qwerty/give_json.json') json = JSON.parse(response.body)
默认情况下, httparty
已在httparty.rb中包含JSON库。
这意味着require 'json'
调用require 'json'
。
感谢您提供这些示例!
您可以使用JSON和net / http lib ..如下所示:
require 'net/http' require 'json' url = "https://api.url/" uri = URI(url) response = Net::HTTP.get(uri) data = JSON.parse(response) objs.each do |data| title = data["title"]