JQ将Array插入到对象中

时间:2017-12-26 18:58:45

标签: arrays json bash jq

我正在使用大型数据集,我正在使用JQ构建一个只包含我感兴趣的数据的对象。为了帮助解决这个问题,我提供了示例数据来帮助说明我的问题。

到目前为止,我只找到了添加2个对象或2个数组的方法,但我想采用一组平面字段,并将一个数组作为子对象添加到主json中。

tmpData.txt

{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batter": [{
        "id": "1001",
        "type": "Regular",
        "status":{
            "complete": false
        }
    },
    {
        "id": "1002",
        "type": "Chocolate",
        "status":{
            "complete": false
        }
    },
    {
        "id": "1003",
        "type": "Blueberry",
        "status":{
            "complete": false
        }
    },
    {
        "id": "1004",
        "type": "Devil's Food",
        "status":{
            "complete": false
        }
    }
]
}

到目前为止,我最接近的是这个

cat tmpData.txt | jq '[{id, type}] + [(.batter[] | {batterId: .id, complete: .status.complete})]'

只输出顶级字段一次,但每个面糊都是它自己的对象,我需要整个输出为1个对象。

[
  {
    "id": "0001",
    "type": "donut"
  },
  {
    "batterId": "1001",
    "complete": false
  },
  {
    "batterId": "1002",
    "complete": false
  },
  {
    "batterId": "1003",
    "complete": false
  },
  {
    "batterId": "1004",
    "complete": false
  }
]

我的理想输出如下所示:

{
"id": "0001",
"type": "donut",
"batter": [{
    "id": "1001",
    "complete": false
    },
    {
    "id": "1002",
    "complete": false
    },
    {
    "id": "1003",
    "complete": false
    },
    {
    "id": "1004",
    "complete": false
    }]
}

正如您所看到的,有一个单个对象包含我需要知道的所有内容,并且没有重复或无关的数据。我想输出一个包含一系列具有ID及其状态的击球手的对象。

1 个答案:

答案 0 :(得分:0)

jq仅支持使用+运算符添加相同的数据类型。您无法将数组添加到对象,反之亦然。

为了向对象添加数组,我们必须将数组包装在一个对象中,并为包含该数组的对象提供键。如果我们考虑json结构以及如何在json对象中表示数组

,这是有意义的

以下命令将对tmpData.txt文件

起作用

cat tmpData.txt | jq '{id, type} + {Batters: [(.batter[] | {batterId: .id, batterType: .type, status: .status.complete})]}'

输出

{
  "id": "0001",
  "type": "donut",
  "Batters": [
    {
      "batterId": "1001",
      "batterType": "Regular",
      "status": false
    },
    {
      "batterId": "1002",
      "batterType": "Chocolate",
      "status": false
    },
    {
      "batterId": "1003",
      "batterType": "Blueberry",
      "status": false
    },
    {
      "batterId": "1004",
      "batterType": "Devil's Food",
      "status": false
    }
  ]
}