2015-08-23 3 views
0

Я пытаюсь извлечь данные из вложенного json. Невозможно понять проблему здесь. Пожалуйста, игнорируйте поля, которые я передаю в класс ChildArticle. Я могу разобраться.Проблема при извлечении данных из вложенного json

URL для JSON - http://api.nytimes.com/svc/mostpopular/v2/mostshared/all-sections/email/30.json?api-key=31fa4521f6572a0c05ad6822ae109b72:2:72729901

Ниже мой код:

url = 'http://api.nytimes.com' 

#Define the HTTP object 
uri = URI.parse(url) 
http = Net::HTTP.new(uri.host, uri.port) 

#If the api being scraped uses https, then set use_ssl to true. 
http.use_ssl = false 

#Define the request_url 
#Make a GET request to the given url 
request = '/svc/mostpopular/v2/mostshared/all-sections/email/30.json?api-key=31fa4521f6572a0c05ad6822ae109b72:2:72729901' 
response = http.send_request('GET', request) 

#Parse the response body 
forecast = JSON.parse(response.body) 
forecast["results"]["result"].each do |item| 

    date = Date.parse(item["published_date"].to_s) 
    if (@start <= date) && (@end >= date) 
     article = News::ChildArticle.new(author: item["author"], title: item["title"], summary: item["abstract"], 
             images: item["images"],source: item["url"], date: item["published_date"], 
             guid: item["guid"], link: item["link"], section: item["section"], 
             item_type: item["item_type"], updated_date: item["updated_date"], 
             created_date: item["created_date"], 
             material_type_facet: item["material_type_facet"]) 

     @articles.concat([article]) 
    end 
end 

Я получаю ниже ошибки -

[]': no implicit conversion of String into Integer (TypeError) at прогноз [ "результаты"] [ "результат"] каждый. do | item | `

ответ

0

Похожым forecast['results'] - это просто массив, а не хэш.

Посмотрите на этот слегка модифицированный сценарий. Дайте ему прогон в вашем терминале и проверьте его вывод.

require 'net/http' 
require 'JSON' 

url = 'http://api.nytimes.com' 

uri = URI.parse(url) 
http = Net::HTTP.new(uri.host, uri.port) 

http.use_ssl = false 

request = '/svc/mostpopular/v2/mostshared/all-sections/email/30.json?api-key=31fa4521f6572a0c05ad6822ae109b72:2:72729901' 
response = http.send_request('GET', request) 

forecast = JSON.parse(response.body) 

forecast["results"].each.with_index do |item, i| 
    puts "Item #{i}:" 
    puts '--' 

    item.each do |k, v| 
    puts "#{k}: #{v}" 
    end 

    puts '----' 
end 

Кроме того, вы можете проверить структуру JSON в API возвращения из этого URL. Если вы идете к этому URL, откройте JavaScript console и вставьте в

JSON.parse(document.body.textContent) 

вы можете проверить структуру JSON очень легко.

Другой вариант - загрузить ответ в файл JSON и проверить его в своем редакторе. Тем не менее, вам нужен предусилитель JSON.

File.open('response.json', 'w') do |f| 
    f.write(response.body) 
end 
Смежные вопросы