我有一个格式的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(.value[]| . += {"key_v" : (.key)} )' input.json > output.json这是我最接近解决方案的

  • 提取键并添加到对象的键值对
  • 使用映射(select())通过键进行分组 但是我在两个步骤中都会遇到错误,例如无法用字符串名称或字符串值索引数组。
分析解答

它不会赢得选美比赛,但它有效:

with_entries(.value |= from_entries)
| with_entries(.key as $key | .value[] |= {($key):.})
| reduce .[] as $item ({}; . * $item)
| {output: to_entries | map({(.key):.value})}

单一呼叫with_entries

with_entries(.key as $key | .value |= (from_entries | map_values({($key):.})))
| reduce .[] as $item ({}; . * $item)
| {output: to_entries | map({(.key):.value})}

输出:

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