Как я могу получить информацию только для определенного вида деятельности из API Pivotal Tracker?
Я получаю информацию JSON из API Pivotal Tracker, и мне нужно получить определенную информацию вместо всех необработанных данных. Для этого я использовал JSON.parse()
преобразовать JSON в массив хэшей Ruby.
Теперь мне нужно перебрать этот массив и вернуть только соответствующие хеши.
Например, я просто хочу вернуть primary_resources
хэш, который имеет вложенный хеш:
"story_type" => "feature"
Для этого я написал этот код (response.body
это данные, возвращаемые из запроса GET):
@data = response.body
parsed = JSON.parse(@data)
puts parsed['primary_resources']['story_type']['feature']
Когда я запускаю скрипт, я получаю эту ошибку:
no implicit conversion of String into Integer (TypeError)
Кажется, что он перебирает массив хэшей и ищет целое число в массиве (например, array[3]
или же array[0]
), но это мне не поможет. Мне нужно вернуть все хэши, которые имеют вложенный хеш :kind => story
в хеше первичных ресурсов.
Я также попытался сделать это:
parsed.each do |entry|
puts entry['primary_resources']['story_Type']['feature']
end
и я получил ту же ошибку.
Вот мой полный код:
require 'json'
require 'net/http'
require 'open-uri'
require 'openssl'
require 'active_support'
prompt = '> '
puts "What is the id of the Project you want to get data from?"
print prompt
project_id = STDIN.gets.chomp()
puts "What is the beginning date you want to return from? ex: 2014-07-02"
print prompt
date1 = STDIN.gets.chomp()
puts "What is the end date you want to return from? ex: 2014-07-16"
print prompt
date2 = STDIN.gets.chomp()
def scope(project_id, date1, date2)
uri = URI.parse("https://www.pivotaltracker.com/services/v5/projects/#{project_id}/activity?occurred_after=#{date1}T01:00:15Z&occurred_before=#{date2}T01:00:15Z&fields=primary_resources")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(uri.request_uri)
request.add_field("X-TrackerToken", "*****************")
response = http.request(request)
@data = response.body
parsed = JSON.parse(@data)
puts parsed['primary_resources']['story_type']['feature']
# parsed.each do |entry|
# puts entry['primary_resources']['kind']['story']
# end
# puts parsed['primary_resources'].select { |r| r['story_type'].eql? 'feature' }
end
scope(project_id, date1, date2)
Вот часть ответа JSON без разбора (полный ответ слишком длинный, и на самом деле это тот же ответ, что и для 15 других пользовательских историй):
What is the id of the Project you want to get data from?
> 961142
What is the beginning date you want to return from? ex: 2014-07-02
> 2014-07-02
What is the end date you want to return from? ex: 2014-07-16
> 2014-07-03
[
{
"primary_resources": [
{
"kind": "story",
"id": 74313670,
"name": "User can make an image fit inside the grid when viewing image detail and save it to case template. BUILD 146",
"story_type": "bug",
"url": "https://www.pivotaltracker.com/story/show/74313670"
}
],
"guid": "961142_3419",
"project_version": 3419
},
Вот часть ответа JSON после анализа (показ первого рассказа по той же причине, что и выше):
What is the id of the Project you want to get data from?
> 961142
What is the beginning date you want to return from? ex: 2014-07-02
> 2014-07-02
What is the end date you want to return from? ex: 2014-07-16
> 2014-07-03
{"primary_resources"=>[{"kind"=>"story", "id"=>74313670, "name"=>"User can make an image fit inside the grid when viewing image detail and save it to case template. BUILD 146", "story_type"=>"bug", "url"=>"https://www.pivotaltracker.com/story/show/74313670"}], "guid"=>"961142_3419", "project_version"=>3419}
Как я могу перебрать этот массив хэшей и вернуть только те из "story_type"=>"feature"?
1 ответ
Таким образом, согласно документации API, ваш код получает массив действий (или "ресурсов типа действия"), каждый из которых может содержать подмассив (в "primary_resources") ресурсов, на которые он влияет.
Я предполагаю, что вы хотите получить в качестве выходных данных из вашей программы массив действий, относящихся к истории типа "функция", а не массив самих затронутых историй. Если это правда, попробуйте это:
feature_story_activities = parsed.select do |activity|
activity.has_key?('primary_resources') &&
activity['primary_resources'].find do |resource|
resource['story_type'].eql?('feature')
end
end
puts feature_story_activities
Это места в feature_story_activities
все виды деятельности, которые
Укажите список ресурсов, на которые они влияют, и
Влияет как минимум на одну историю типа объекта.