2016-11-25 3 views
0

Я пытаюсь разобрать дополнительный ключ к существующему 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!' 

ответ

2

key['metric_details'] возвращает хэш:

{ 
    "Damages":{ 
    "performance_score":91, 
    "compliance_score":100 
    }, 
    "Error Indicators": { 
    "performance_score":100, 
    "compliance_score":"N/A" 
    }, 
    ... 
    ... 
} 

Итак, вам нужно искать информацию в этой хэш:

hash = key['metric_details'] 
damages = hash['Damages'] 
performance_score = damages['performance_score'] 
compliance_score = damgages['compliance_score'] 

Вот является полный пример:

require 'json' 

data = %Q{ 
{"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 
} 
} 
} 
] 

} 
} 

data = JSON.parse data 
data_to_write = "" 

types = %w(pack ship) 
types.each do |type| 
    metric = data[type] 
    next if metric.nil? 

    metric.sort.each do |hash| 
    state_id    = hash['state_id'] 
    raw_date    = hash['date'] 
    # Can't figure how to parse this metric_details   = key['metric_details'] 
    #performance_score  = key['performance_score'] 
    #audit_compliance_score = key['compliance_score'] 
    metric_details = hash['metric_details'] 
    damages_hash = metric_details['Damages'] 
    performance_score = damages_hash['performance_score'] 
    compliance_score = damages_hash['compliance_score'] 

    data_to_write << "('#{state_id}', 
         '#{raw_date}', 
         '#{type}', 
         '#{performance_score}', 
         '#{compliance_score}')" 
    puts data_to_write 
    end 
end 

--output:-- 
('CA', 
         '2016-11-24T00:00:00.000-08:00', 
         'pack', 
         '91', 
         '100') 
+0

Может ли это быть реализовано в цикле 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

+1

@ Spartacus38, я думаю, вы можете просто поместить этот код в свой комментарий и удалить две строки под комментарием. – 7stud

+0

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

Смежные вопросы