我有一个格式的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"
}
}
]
}