加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 21:21:09 所属栏目:百科 来源:网络整理
导读:我正在努力教自己ruby并解决工作中的问题.我的最终目标是从API中提取 JSON响应中的许多字段中的三个,操作并转储到CSV以进行执行报告. JSON的结构是: { "status": 200,"data": { "total": 251,"alerts": [ { "dataPoint": "x","ackedBy": "x","dataSourceIns
我正在努力教自己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中获取所有这些值

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读