Как отфильтровать отсутствующий внутренний ключ с помощью jq - PullRequest
2 голосов
/ 21 мая 2019

Получил JSON-ввод, как это:

[ 
{
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322460000,
      "value": "0.0"
    }
  },
  {
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322160000,
      "value": "0.0"
    }
  },
  {
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": "3423.25"
  }
]

Третий объект не имеет метки времени. Как я мог вернуть все объекты только с отметкой времени. Как следующее:

[ 
{
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322460000,
      "value": "0.0"
    }
  },
  {
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322160000,
      "value": "0.0"
    }
  }
]

Большое спасибо заранее.

Ура, Винсент

Ответы [ 3 ]

3 голосов
/ 21 мая 2019
map( select ( .values | has("timestamp")? ))
2 голосов
/ 21 мая 2019

и вот альтернативное решение с использованием Unix-инструмента Walk-Path для JSON: jtc:

bash $ <file.json jtc -w'<timestamp>l:[-2]' -j
[
   {
      "dimensions": "helloworld",
      "metrics": "sum(is_error)",
      "values": {
         "timestamp": 1558322460000,
         "value": "0.0"
      }
   },
   {
      "dimensions": "helloworld",
      "metrics": "sum(is_error)",
      "values": {
         "timestamp": 1558322160000,
         "value": "0.0"
      }
   }
]
bash $ 
  • , которое находит каждый(все) метка timestamp, затем поднимается на 2 уровня от найденной записи json и печатает найденный элемент Json.-j оборачивает все напечатанные прогулки обратно в массив.

PS> Раскрытие информации: я создатель инструмента jtc

1 голос
/ 29 мая 2019

Рабочий пример: [ .[] | select (.values | has("timestamp")?) ]

https://jqplay.org/s/n5jsRsPMhW

Или альтернатива: [ .[] | select (.values.timestamp?) ]

https://jqplay.org/s/HRWV44YgUp

PS Этоодин был неправильным из-за того, что после. [] вы работаете с каждым элементом отдельно, а не с массивом.Так что функция «карта» не нужна.

...