ruby: извлечение полей из вложенного json

Я пытаюсь научить себя ruby и решить проблему на работе. Моя конечная цель-извлечь три из многих полей в ответе JSON из API, манипулировать и сбрасывать в 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
[]

есть ли лучший способ сделать это?

1 ответов


попробуйте это:

# just for demonstration, you would probably do json = JSON.parse(response)
json = {
  "status": 200,
  "data": {
    "total": 251,
    "alerts": [
      {
        "dataPoint": "x",
        "ackedBy": "x",
        ...

только для общего:

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

для других значений, о которых вы спрашивали:

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

теперь вопрос в том, что вы хотите сделать с результатами? Вы хотите собрать их в новый хэш? The 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

теперь вы можете получить все эти значения в collected_alerts