如何修复jq展平JSON数组的重复输出 [英] How to fix duplicated output of jq flattening JSON array

查看:59
本文介绍了如何修复jq展平JSON数组的重复输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用jq命令展平JSON文件.但是输出重复了.

请在此处查看我的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
}

任何人都可以看看提供的jqplay URL并提出建议.

解决方案

每个.[]就像一个"for"循环,因此观察到的乘法行为本质上是嵌套for循环的结果.似乎您想要的东西更接近:

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

使用JSON作为输入,这会生成两个JSON对象,尽管其中的第二个与您提供的预期输出稍有不同.

I am trying to flatten a JSON file by using jq command. But the output got duplicated.

Please see my jqplay here: https://jqplay.org/s/gwvMIH_fed

My input 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"
    }
  ]
}

My expected output:

{
  "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
}

Could anyone please have a look at the provided jqplay URL and advise.

解决方案

Each .[] is like a "for" loop, so the multiplicative behavior you observe is essentially the result of having nested for loops. It would seem that what you want is closer to:

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

With your JSON as input, this produces two JSON objects, though the second of these differs very slightly from what you give as the expected output.

这篇关于如何修复jq展平JSON数组的重复输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆