Как исправить дублированный вывод JQ-сплющивающего массива JSON - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь сгладить файл JSON с помощью команды jq. Но вывод дублировался.

Пожалуйста, смотрите мой jqplay здесь: https://jqplay.org/s/gwvMIH_fed

Мой ввод JSON:

{
  "cost": 0.0,
  "interval": "0:01:00",
  "namespace": "Microsoft.ApiManagement/service",
  "resourceregion": "australiaeast",
  "timespan": "2019-05-22T00:00:00Z/2019-05-22T00:02:00Z",
  "value": [
    {
      "id": "/my-api/providers/Microsoft.Insights/metrics/Capacity",
      "name": {
        "localizedValue": "Capacity",
        "value": "Capacity"
      },
      "resourceGroup": "my-group",
      "timeseries": [
        {
          "data": [
            {
              "average": 15,
              "count": null,
              "maximum": null,
              "minimum": null,
              "timeStamp": "2019-05-22T00:00:00+00:00",
              "total": null
            },
            {
              "average": 16,
              "count": null,
              "maximum": null,
              "minimum": null,
              "timeStamp": "2019-05-22T00:01:00+00:00",
              "total": null
            }
          ],
          "metadatavalues": []
        }
      ],
      "type": "Microsoft.Insights/metrics",
      "unit": "Percent"
    }
  ]
}

Мой ожидаемый результат:

{
  "apiId": "/my-api/providers/Microsoft.Insights/metrics/Capacity",
  "metrics": "Capacity",
  "timestamp": "2019-05-22T00:00:00+00:00",
  "value": 15
}
{
  "apiId": "/my-api/providers/Microsoft.Insights/metrics/Capacity",
  "metrics": "Capacity",
  "timestamp": "2019-05-22T00:01:00+00:00",
  "value": 16
}

Может ли кто-нибудь взглянуть на предоставленный URL-адрес jqplay и дать совет.

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Каждый. [] Подобен циклу «for», поэтому наблюдаемое вами мультипликативное поведение по сути является результатом вложенности циклов.Может показаться, что то, что вы хотите, ближе к:

.value[] as $v
| $v.timeseries[].data[] as $d
| {"apiId": $v.id,
  "metrics": $v.name.value,
  "timestamp": $d.timeStamp,
  "value": $d.average }

Если в качестве входных данных используется JSON, это создает два объекта JSON, хотя второй из них очень незначительно отличается от того, что вы даете в качестве ожидаемого результата.

0 голосов
/ 27 июля 2019

та же манипуляция с JSON достижима с помощью утилиты unix на основе пешеходной дорожки jtc:

bash $ <input.json jtc -w'<id>l<A>v[-1][name][value]<M>v[-2]<average>l:<V>v[-1][timeStamp]' -T'{"apiId":{{A}},"metrics":{{M}},"value":{{V}},"timestamps":{{}}}'
{
   "apiId": "/my-api/providers/Microsoft.Insights/metrics/Capacity",
   "metrics": "Capacity",
   "timestamps": "2019-05-22T00:00:00+00:00",
   "value": 15
}
{
   "apiId": "/my-api/providers/Microsoft.Insights/metrics/Capacity",
   "metrics": "Capacity",
   "timestamps": "2019-05-22T00:01:00+00:00",
   "value": 16
}
bash $ 

walk-path там (-w) просто собирает все необходимые значения JSON в соответствующие пространства имен (A, M, V) для последующей интерполяции шаблона (обратите внимание, что последний пройденный элемент не требует сохранения в пространстве имен, поскольку это может быть интерполировано с использованием {{}} нотации)

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

...