如何去规范化这个 json 结构

how to denormalise this json structure

我有一份 json 格式的备份概览,使用 pgbackrest 生成。为简单起见,我删除了很多杂乱的内容,因此主要结构得以保留。该列表可以包含多个备份结构,为了简单起见,我在这里减少到只有 1 个。

[
  {
    "backup": [
      {
        "archive": {
          "start": "000000090000000200000075",
          "stop": "000000090000000200000075"
        },
        "info": {
          "size": 1200934840
        },
        "label": "20220103-122051F",
        "type": "full"
      },
      {
        "archive": {
          "start": "00000009000000020000007D",
          "stop": "00000009000000020000007D"
        },
        "info": {
          "size": 1168586300
        },
        "label": "20220103-153304F_20220104-081304I",
        "type": "incr"
      }
    ],
    "name": "dbname1"
  }
]

我尝试使用 jq 从中生成一个 simpeler 格式,直到现在都没有运气。

我希望看到的是 backup.archive、backup.info、backup.label、backup.type 名称组合在一个简单的结构中,而无需进入笛卡尔积.我会很高兴得到以下输出:

[
  {
    "backup": [
      {
        "archive": {
          "start": "000000090000000200000075",
          "stop": "000000090000000200000075"
        },
        "name": "dbname1",
        "info": {
          "size": 1200934840
        },
        "label": "20220103-122051F",
        "type": "full"
      },
      {
        "archive": {
          "start": "00000009000000020000007D",
          "stop": "00000009000000020000007D"
        },
        "name": "dbname1",
        "info": {
          "size": 1168586300
        },
        "label": "20220103-153304F_20220104-081304I",
        "type": "incr"
      }
    ]
  }
]

其中名称被多余地添加到列表中。如何使用 jq 将显示的输入转换为请求的输出?最后我只想从数据中生成一个简单的 csv。即使使用

的简化结构
'.[].backup[].name + ":" + .[].backup[].type'

我得到笛卡尔积:

"dbname1:full"
"dbname1:full"
"dbname1:incr"
"dbname1:incr"

如何解决?

因此,对于顶级数组中的每个对象,您希望将 .name 拉入其每个 .backup 数组的元素中,对吗?然后尝试

jq 'map(.backup[] += {name} | del(.name))'

Demo

然后,使用 jq 生成 CSV 输出很容易:有一个名为 @csv 的内置函数,它将一个数组转换为一个字符串,其值带有引号(如果它们是字符串的话)并以逗号分隔。因此,您需要做的就是迭代地将所需的值组合到数组中。在这一点上,删除 .name 不再是必要的,因为无论如何我们正在拼凑数组以进行 CSV 输出。我们将 -r 标志提供给 jq 以便输出原始文本而不是 JSON.

jq -r '.[]
  | .backup[] + {name}
  | [(.archive | .start, .stop), .name, .info.size, .label, .type]
  | @csv
'

Demo