JQ JSON переместить объект во вложенный объект и итерации по неизвестным именам / номерам объектов - PullRequest
0 голосов
/ 07 мая 2018

Я просмотрел несколько примеров парсинга строк json 'jq', все они очень полезны, но не являются окончательными для моей конкретной проблемы

Вот мой ввод JSON:

{
    "outcome" : "TrBean",
    "result" : {"TrAct" : {
        "executiontime" : 16938570,
        "invocations" : 133863,
        "waittime" : 4981
    }}
}
{
    "outcome" : "WwwBean",
    "result" : {}
}
{
  "outcome": "CRFeatureBean",
  "result": {
    "CRChannels": {
      "executiontime": 78127,
      "invocations": 9983,
      "waittime": 213
    },
    "getCRChannels": {
      "executiontime": 98704,
      "invocations": 10113,
      "waittime": 212
    },
    "getCRToMigrate": {
      "executiontime": 32,
      "invocations": 4,
      "waittime": 0
    },
    "getCRId": {
      "executiontime": 28198633,
      "invocations": 747336,
      "waittime": 19856
    }
  }
}

Я пытаюсь кормить графит через плагин collectd exec (PUTVAL), поэтому мне нужна информация в одной строке. Я пробовал с ./jq '.result|to_entries[]|{"method:" .key, "inv": .value.invocations}|"PUTVAL \(.method)/invoke:\(.invokes)"' ... но мне нужно, чтобы в каждой строке тоже был "исход".

Также я не знаю ни количества, ни названий объектов-результатов

Итак, я хотел бы закончить с:

TrBean_TrAct
WwwBean
CRFeatureBean_CRChannels
CRFeatureBean_getCRChannels
CRFeatureBean_getCRToMigrate
CrFeatureBean_getCRId

1 Ответ

0 голосов
/ 07 мая 2018

Следующий фильтр jq выдает желаемый результат при вызове jq с параметром командной строки -r:

((.result | keys_unsorted[]) // null) as $key
| if $key == null then .outcome
  else [.outcome, $key] | join("_")
  end

Есть, конечно, много возможных вариантов, например,

((.result | keys_unsorted[]) // null) as $key
| [.outcome, ($key // empty)]
| join("_")

или если вы хотите короткую однострочную строку:

.outcome + ("_" + (.result | keys_unsorted[]) // null)

В любом случае, ключом к простоте является генерация ключей .result в виде потока. Обработка «крайнего случая» делает решение несколько более сложным, чем могло бы быть, то есть .outcome + "_" + (.result | keys_unsorted[])

Пример вызова: jq -r -f program.jq input.json

...