如何使用jq通过子值对象的键对json对象进行分组

问题描述 投票:0回答:1

我有一个格式为 json 的文件

{
  "hello": [
    {
      "name": "var1",
      "value": "1234"
    },
    {
      "name": "var2",
      "value": "2356"
    },
    {
      "name": "var3",
      "value": "2356"
    }
  ],
  "hi": [
    {
      "name": "var1",
      "value": "3412"
    },
    {
      "name": "var2",
      "value": "2563"
    },
    {
      "name": "var3",
      "value": "4256"
    }
  ],
  "bye": [
    {
      "name": "var1",
      "value": "1294"
    },
    {
      "name": "var2",
      "value": "8356"
    },
    {
      "name": "var3",
      "value": "5356"
    }
  ]
}

我想把这个对象转换成这种格式

{
  "output": [
    {
      "var1": {
        "hello": "1234",
        "hi": "3412",
        "bye": "1294"
      }
    },
    {
      "var2": {
        "hello": "2356",
        "hi": "2563",
        "bye": "8356"
      }
    },
    {
      "var3": {
        "hello": "2356",
        "hi": "4256",
        "bye": "5356"
      }
    }
  ]
}

到目前为止,我已经尝试了多种方法,使用 jq 中的 to_entries 和 map 函数来创建输出变量内的内容

jq 'to_entries | map(.value[]| . += {"key_v" : (.key)} )' input.json > output.json
这是我最接近的解决方案

  • 提取键并添加到对象的键值对中
  • 使用map(select())按键分组 但我在这两个步骤中都遇到错误,例如无法使用字符串名称或字符串值索引数组。
json shell command-line-interface jq
1个回答
0
投票

如果使用以下面向流的“合并”函数,则很容易获得简单的解决方案:

def coalesce(s):
  reduce s as $obj ({};
    . as $in
    | $obj
    | to_entries[0]
    | .key as $k
    | .value as $v
    | $in
    | .[$k] += $v);

现在的解决方案很简单:

coalesce(to_entries[]
         | .key as $key
         | .value[]
         | {(.name): {($key): .value}})
| {output: [.]}
© www.soinside.com 2019 - 2024. All rights reserved.