如何在jq中添加父键?将数组元素内值提升为元素父键
嘿,我来帮你搞定这个jq的问题!你之前尝试的map(.name: {.})命令没法正常工作,主要是两个语法问题:一是动态键名的写法不对,二是{.}这种写法不符合jq的语法规范。下面给你几种不同需求对应的正确写法,你可以根据自己的实际情况选择:
情况1:每个数组元素转为以自身name为键、整个元素为值的对象
如果你的目标是让数组里的每个元素都变成一个独立的对象,键是该元素的name值,值是整个元素本身,用这个命令:
jq 'map({(.name): .})'
举个例子:
输入JSON:
[
{"name": "Alice", "email": "alice@example.com"},
{"name": "Bob", "email": "bob@example.com"}
]
输出结果:
[
{
"Alice": {
"name": "Alice",
"email": "alice@example.com"
}
},
{
"Bob": {
"name": "Bob",
"email": "bob@example.com"
}
}
]
情况2:将整个数组合并为一个大对象,键为各元素的name
如果你想把整个数组转换成一个单一对象,用每个元素的name作为键,对应元素作为值,用这个命令:
jq 'from_entries(map({key: .name, value: .}))'
示例效果:
输入JSON:
[
{"name": "Alice", "email": "alice@example.com"},
{"name": "Bob", "email": "bob@example.com"}
]
输出结果:
{
"Alice": {
"name": "Alice",
"email": "alice@example.com"
},
"Bob": {
"name": "Bob",
"email": "bob@example.com"
}
}
情况3:将name作为父键,值为去掉name属性后的元素
如果希望父键是name值,而值里不再包含name属性,可以用del命令移除它:
jq 'map({(.name): del(.name)})'
示例效果:
输入JSON:
[
{"name": "Alice", "email": "alice@example.com"},
{"name": "Bob", "email": "bob@example.com"}
]
输出结果:
[
{
"Alice": {
"email": "alice@example.com"
}
},
{
"Bob": {
"email": "bob@example.com"
}
}
]
关键语法说明
(.name):用括号包裹属性访问是jq中定义动态键名的方式,这样jq才会把.name的值作为键,而不是把字符串.name当成键名。map(...):遍历数组中的每一个元素,对每个元素执行括号内的操作。from_entries:专门用来把[{key: "键名", value: "值"}, ...]格式的数组转换成对应的对象。del(.name):删除当前元素的name属性,返回剩下的属性组成的对象。
内容的提问来源于stack exchange,提问作者RaGe

