ruby:从嵌套的json中提取字段

前端之家收集整理的这篇文章主要介绍了ruby:从嵌套的json中提取字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在努力教自己ruby并解决工作中的问题.我的最终目标是从API中提取 JSON响应中的许多字段中的三个,操作并转储到CSV以进行执行报告.

JSON的结构是:

{
  "status": 200,"data": {
    "total": 251,"alerts": [
      {
        "dataPoint": "x","ackedBy": "x","dataSourceInstance": "x","dataSource": "x","host": "x","endOn": 0,"ackedOn": 1385085190,"dataSourceInstanceId": 588384,"hostId": 935,"type": "alert","dataSourceId": 694,"ackedOnLocal": "2013-11-21 17:53:10 PST","id": 6170384,"startOn": 1385084917,"thresholds": "!= 1 1 1","endOnLocal": "","level": "error","ackComment": "x","value": "No Data","hostDataSourceId": 211986,"acked": true,"hostGroups": [{
          "alertEnable": true,"createdOn": 1362084592,"id": 21,"parentId": 78,"description": "","appliesTo": "","name": "2600hz","fullPath": "x"
        }],"startOnLocal": "2013-11-21 17:48:37 PST"
      },

具体来说,我想提取出dataPoint,startOn,ackedOn.

我想我需要首先提取总值,所以我知道我有多少警报.这将帮助我遍历警报实例.

*url = "https://xyz"
uri = URI(url)
http = Net::HTTP.new(uri.host,443)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
req = Net::HTTP::Get.new(uri.request_uri)
response = http.request(req)

# Make sure we had a proper web response
if response.code == '200' then

# Set up that the total is two levels deep in the json
path = JsonPath.new('$.total')

# Extract out total field into variable
totalAlerts = path.on(response)

# Print hash to confirm value
pp totalAlerts

end*

我被困在试图提取总数.输出没有显示

sudo ruby alerts.rb
[]

有一个更好的方法吗?

解决方法

试试这个:
# just for demonstration,you would probably do json = JSON.parse(response)
json = {
  "status": 200,...

仅限总数:

total = json['data']['total']

对于您询问的其他值:

json['data']['alerts'].each do |alerts|
  # do whatever you want with these...
  alerts['dataPoint']
  alerts['startOn']
  alerts['ackedOn']

现在的问题是,你想对结果做些什么?你想将它们收集到一个新的哈希? json [‘data’] [‘alerts’]是一个数组,所以你必须决定如何收集它们.你可以这样做:

collected_alerts = { 'dataPoints' => [],'startOns' => [],'ackedOns' => [] }
json['data']['alerts'].each do |alerts|
  collected_alerts['dataPoints'] << alerts['dataPoint']
  collected_alerts['startOns'] << alerts['startOn']
  collected_alerts['ackedOns'] << alerts['ackedOn']
end

现在,您可以在gather_alerts中获取所有这些值

猜你在找的Ruby相关文章