2013-09-02 10 views
9

używam 'json gem' i potrzebują danych JSON ładunek z jakiegoś url, na przykład:Ruby on Rails i JSON parser z URL

"http://locallhost:3000/qwerty/give_json.json" z

{"one":"Omg","two":125,"three":"Hu"} 

Mam szyn aplikacji

class QwertyController < ApplicationController 
    require 'json' 

    def get_json 
     source = "http://localhost:3000/qwerty/give_json.json" 
     @data = JSON.parse(JSON.load(source)) 
    end 
end 

mi się błąd

JSON::ParserError in QwertyController#get_json 
795: unexpected token at 'http://localhost:3000/qwerty/give_json.json' 

W łańcuchu: @data = JSON.parse (JSON.load (źródło))

Co się stało? Jak mogę uzyskać dane JSON i przeanalizować je? Staram @data [ "jeden"] ...

+0

Wygląda na to, że masz nieprawidłowy JSON w źródle – cpjolicoeur

+0

Nie, nie jest. Stworzyłem aplikację szyn, która generuje odpowiedź JSON na porcie 3000 (http: // localhost: 3000/qwerty/give_json.json). I druga aplikacja, która próbuje uzyskać dane JSON na porcie 3001 (http: // localhost: 3001/qwerty/get_json) –

+0

Jaką wersję ruby ​​używasz? nie musisz wymagać json w nowszych wersjach szyn i rubinów ... –

Odpowiedz

38

JSON.load bierze źródło to jest String lub IO obiektu zgodnie z dokumentacją

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"} 

Dajesz mu String to jest adres URL i dlatego pojawia się błąd. Można użyć open-uri do pobrania danych z adresu URL, aby być następnie analizowane przez JSON jak tak ...

[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"} 

UWAGA

open zwraca StringIO przedmiot, który reaguje na read zwracania danych JSON. JSON.load zamienia dane w mieszanie, które ma być użyte.

do analizowania ciąg JSON można użyć JSON.load lub JSON.parse

+0

Wielkie dzięki. To działa) –

12

Można użyć netto biblioteki/HTTP jak poniżej:

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) 

Albo partia gem http:

require 'httparty' 

response = HTTParty.get('http://localhost:3000/qwerty/give_json.json') 
json = JSON.parse(response.body) 
3

Domyślnie httparty zawiera już bibliotekę JSON w zakresie httparty.rb.
Oznacza to, że połączenie z numerem require 'json' jest niepotrzebne.

Dzięki za dostarczenie przykładów!