我正在尝试解析一个已解析了一段时间的现有JSON的附加密钥,但最近我们添加了一个新的键"metric_details“,该键分隔各个区域,其中包含两个键以及"performance_score”和"compliance_score“。现在,我已经能够在没有问题的情况下解析这个问题了,但是我想不出如何提取metric_details并将分数导出到我的RDS中。
解析代码:
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,type,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!'发布于 2016-11-25 18:14:19
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')https://stackoverflow.com/questions/40809648
复制相似问题