2013-09-02 68 views
9

tôi sử dụng 'viên ngọc json' và cần dữ liệu JSON tải từ một số url, ví dụ:Ruby on Rails và JSON phân tích cú pháp từ URL

"http://locallhost:3000/qwerty/give_json.json" với

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

tôi có đường ray ứng dụng

class QwertyController < ApplicationController 
    require 'json' 

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

Tôi gặp lỗi

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

Trong chuỗi: @data = JSON.parse (JSON.load (nguồn))

Có vấn đề gì? Làm thế nào tôi có thể nhận được dữ liệu JSON và phân tích nó? Tôi cố gắng @data [ "one"] ...

+0

Có vẻ như bạn có JSON không hợp lệ trong nguồn – cpjolicoeur

+0

Không có. Tôi tạo ra một ứng dụng đường ray, tạo ra câu trả lời JSON trên cổng 3000 (http: // localhost: 3000/qwerty/give_json.json). Và ứng dụng thứ hai, cố gắng lấy dữ liệu JSON trên cổng 3001 (http: // localhost: 3001/qwerty/get_json) –

+0

Bạn đang sử dụng phiên bản ruby ​​nào? bạn không cần phải yêu cầu json trong phiên bản mới hơn của đường ray và ruby ​​... –

Trả lời

38

JSON.load mất một nguồn mà là một String hoặc IO đối tượng theo các tài liệu

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

Bạn đang đem lại cho nó một String đó là một URL và đó là lý do tại sao bạn nhận được một lỗi. Bạn có thể sử dụng open-uri để lấy dữ liệu từ URL để sau đó được phân tích bởi JSON như vậy ...

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

LƯU Ý

open trả về một đối tượng StringIO mà đáp ứng read trả lại dữ liệu JSON. JSON.load chuyển dữ liệu thành một băm được sử dụng.

Để phân tích chuỗi JSON bạn có thể sử dụng JSON.load hoặc JSON.parse

+0

Cảm ơn rất nhiều. Nó hoạt động) –

12

Bạn có thể sử dụng lưới thư viện/http như dưới đây:

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) 

Hoặc đảng viên ngọc http:

require 'httparty' 

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

Theo mặc định, httparty đã bao gồm thư viện JSON trong httparty.rb.
Điều này có nghĩa là cuộc gọi đến require 'json' là không cần thiết.

Cảm ơn bạn đã cung cấp các ví dụ này!

Các vấn đề liên quan