我正在努力教自己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中获取所有这些值