Я пытаюсь разобрать дополнительный ключ к существующему JSON, который я разбирал в течение некоторого времени, но в последнее время мы добавляем новый ключ «metric_details», который разделяет отдельные области, в том числе 2 клавиши, а также «performance_score», и "compliance_score". Теперь я смог разобрать это без проблем, но не могу понять, насколько я могу вытащить metric_details, а также экспортировать оценки в мой RDS.Ruby JSON анализирует «под-ключи»?
Анализировать Код:
states = %w(CA TX)
results_warehouses = states
creds = User_creds
data_to_write = []
results_warehouses.each do |code|
dashboard = "https://sample.website.com/states/scorecard.json?state_id=#{code}"
puts "Pulling from #{dashboard}"
begin
data = HTTParty.get(dashboard, :basic_auth=> {:username => creds.public.text, :password => creds.private.text})
rescue
puts "Could not fetch data for #{code}. Skipping..."
next
end
types = %w(pack ship)
types.each do |type|
metric = data[type]
next if metric.nil?
metric.sort.each do |key|
state_id = key['state_id']
raw_date = key['date'].to_date
# Can't figure how to parse this metric_details = key['metric_details']
performance_score = key['performance_score']
audit_compliance_score = key['compliance_score']
data_to_write << "('#{state_id.to_s}',
'#{raw_date.to_s}',
'#{type.to_s}',
'#{metric_details.to_s}',
'#{performance_score.to_s}',
'#{compliance_score.to_s}')"
puts data_to_write
end
end
unless data_to_write.empty?
puts 'Inserting data'
db_conn = DatabaseConnect.new
db_client = db_conn.connect_mysql
ins = "INSERT IGNORE INTO `data`.`scoring` VALUES #{data_to_write.join(',')}"
db_client.query(ins)
end
db_conn.disconnect
puts 'Completed.'
end
puts 'All done!'
И вот JSON я растаскивания, который не имеет никаких проблем, пока я не попытаться захватить отдельные метрические детали
"pack":[
{
"state_id":"CA",
"total_score":90,
"compliance_score":100,
"performance_score":80,
"date":"2016-11-24T00:00:00.000-08:00",
"metric_details":{
"Damages":{
"performance_score":91,
"compliance_score":100
},
"Error Indicators":{
"performance_score":100,
"compliance_score":"N/A"
},
"Unverified":{
"performance_score":75,
"compliance_score":100
},
"Pack Miss":{
"performance_score":54,
"ompliance_score":100
}
}
}
],
И моя структура стола довольно проста:
И по существу хотел форматировать как таковой:
CA, 2016-11-25, пакет, Удара, 75, 100
state_id, raw_date, тип, metric_details, performance_score, compliance_score
Спасибо вы за помощь!
Обновлено:
states = %w(CA TX)
results_warehouses = states
creds = User_creds
data_to_write = []
results_warehouses.each do |code|
dashboard = "https://sample.website.com/states/scorecard.json?state_id=#{code}"
puts "Pulling from #{dashboard}"
begin
data = HTTParty.get(dashboard, :basic_auth=> {:username => creds.public.text, :password => creds.private.text})
rescue
puts "Could not fetch data for #{code}. Skipping..."
next
end
types = %w(pack ship)
types.each do |type|
metric = data[type]
next if metric.nil?
metric.sort.each do |key|
state_id = key['state)ud']
raw_date = key['date'].to_date
hash = key['metric_details']
damages = hash['Damages']
performance_score = damages['performance_score']
audit_compliance_score = damages['compliance_score']
data_to_write << "('#{state_id.to_s}',
'#{raw_date.to_s}',
'#{type.to_s}',
'#{metric_details.to_s}',
'#{performance_score.to_s}',
'#{audit_compliance_score.to_s}')"
puts data_to_write
end
end
unless data_to_write.empty?
puts 'Inserting data'
db_conn = DatabaseConnect.new
db_client = db_conn.connect_mysql
ins = "INSERT IGNORE INTO `data`.`scoring` VALUES #{data_to_write.join(',')}"
db_client.query(ins)
end
db_conn.disconnect
puts 'Completed.'
end
puts 'All done!'
Может ли это быть реализовано в цикле inital? следующий if metric.nil? metric.sort.each do | ключ | warehouse_id клавиша = [ 'warehouse_id'] raw_date = клавишу [ 'дата']. To_date хэш = клавиша [ 'metric_details'] повреждения = хэш [ 'УБЫТКОВ'] performance_score = повреждения [ 'performance_score'] audit_compliance_score = damages ['compliance_score'] – Spartacus38
@ Spartacus38, я думаю, вы можете просто поместить этот код в свой комментарий и удалить две строки под комментарием. – 7stud
lib/script/metric_details.rb: 38: в блоке (3 уровня) в ': неопределенная локальная переменная или метод 'metric_details' для main: Object (NameError) из lib/script/metric_details. rb: 27: in 'each ' из lib/script/metric_details.rb: 27: в блоке (2 уровня) в <верхний (обязательно)>' из lib/script/metric_details.rb: 23: в каждом ' from lib/script/metric_details.rb: 23: in 'block in ' из lib/script/metric_details.rb: 7: in' each ' из lib/script/metric_details.rb: 7: in ' ' –
Spartacus38