首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby解析“子键”?

Ruby解析“子键”?
EN

Stack Overflow用户
提问于 2016-11-25 17:00:37
回答 1查看 159关注 0票数 0

我正在尝试解析一个已解析了一段时间的现有JSON的附加密钥,但最近我们添加了一个新的键"metric_details“,该键分隔各个区域,其中包含两个键以及"performance_score”和"compliance_score“。现在,我已经能够在没有问题的情况下解析这个问题了,但是我想不出如何提取metric_details并将分数导出到我的RDS中。

解析代码:

代码语言:javascript
复制
   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,它没有问题,直到我尝试获取各个度量细节

代码语言:javascript
复制
"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

谢谢你的帮助!

更新:

代码语言:javascript
复制
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!'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-25 18:14:19

key['metric_details']返回哈希:

代码语言:javascript
复制
{
  "Damages":{
    "performance_score":91,
    "compliance_score":100
  },
  "Error Indicators": {
    "performance_score":100,
    "compliance_score":"N/A"
  },
  ...
  ...
}

因此,您需要在该散列中查找信息:

代码语言:javascript
复制
hash = key['metric_details']
damages = hash['Damages']
performance_score = damages['performance_score']
compliance_score = damgages['compliance_score']

下面是一个完整的例子:

代码语言:javascript
复制
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')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40809648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档