извлечение пути, метода и типа контента из сваггера json с помощью jq - PullRequest
2 голосов
/ 16 января 2020

У меня уже есть грубое решение этой проблемы, но я впервые работаю с JQ, и я чувствую, что результат немного неуклюжий, и я хотел бы получить совет о том, как его очистить, или предложения, как Я мог бы использовать больше идиоматических c форм.

У меня есть swagger спецификация интерфейса ( полный файл здесь ), и я хочу извлечь информацию для каждого из пути, поддерживаемые методы и типы содержимого, ожидаемые в каждом случае

Например, из:

{
   "paths" : {
      "/1.0/kb/paymentGateways/hosted/form/{accountId}" : {
         "post" : {
            "produces" : [
               "application/json"
            ],
            "consumes" : [
               "application/json"
            ]
      }
}

Я хотел бы получить:

{
  "path": "/1.0/kb/paymentGateways/hosted/form/{accountId}",
  "method": "post",
  "produces": "application/json",
  "consumes": "application/json"
}

и вот jq-запрос, который я использовал для этого:

jq 'def nvl(n): (n//[null])[];'\
'.paths | keys[] as $path | .[$path] | keys[] as $method | .[$method] | '\
'{ $path, $method, produces: nvl(.produces), consumes: nvl(.consumes)}' swagger.json

Большое спасибо

1 Ответ

2 голосов
/ 16 января 2020

Помимо форматирования, вы можете рассмотреть определение nvl в качестве фильтра 0-арности (который более идиоматичен c и более эффективен) или вообще его избегать. Предполагая bash или bash -подобную оболочку, вы могли бы написать:



jq 'def nvl: (.//[null])[];
  .paths
  | keys_unsorted[] as $path
  | .[$path]
  | keys_unsorted[] as $method
  | .[$method]
  | { $path,
      $method,
      produces: .produces | nvl,
      consumes: .consumes | nvl
    }' swagger.json

Также рассмотрите возможность использования опции командной строки -f.

Обратите внимание, что false // 0 имеет значение 0 , так что вы можете изменить def соответственно. Также было бы разумно остерегаться других потенциальных сюрпризов.

...