这是我的输入JSON
{
"uuid":123,
"description": [
{
"car_name":"Toyota",
"saleDate":"23 May 2017"
}
]
}
预期产出:
{
"uuid":123,
"description": [
{
"name":"Toyota",
"saleDate":"23 May 2017"
}
]
}
规则:.description [] | = {name:.car_name,saleDate}
我能够通过此规则获得所需的结果。但是,有没有办法可以重命名' car_name'财产到'名称'并且也没有提到规则中的所有其他属性(在这种情况下,' saleDate')。我可能最终在对象中有50多个属性,我不想在规则中提及所有这些属性。
数组中可以有多个对象。
答案 0 :(得分:2)
在确保仅更改特定键名称时保留键的顺序:
jq '.description[] |= with_entries(if .key == "car_name" then .key = "name" else . end)'
答案 1 :(得分:1)
这样做你想要的吗?
jq '.description[]
|= . +
if has("car_name") then {"name":.car_name}
else null end
| del(.description[].car_name)'
if-then块将对象{name:.car_name}添加到描述数组中具有名称“car_name”的键的任何对象,并且不向数组中没有的任何对象添加任何内容(null)这个名字的钥匙。
del函数删除路径表达式.description []。car_name
中的键值对答案 2 :(得分:0)
我刚从另一个问题的答案中学到了+ =。它也适用于此。
jq '.description[] |= (select(has("car_name")) += {"name":.car_name} | del(.car_name))'
select函数选择满足条件的对象。然后我们添加并删除这些对象。
答案 3 :(得分:0)
这似乎在保留订单时起作用。
jq '.description[] |= with_entries( .key |= gsub("car_name"; "name") )'
jq manual解释了with_entries的作用。
信用额度达到峰值answer to a similar question。
答案 4 :(得分:0)
jq&#39; .description [] | = with_entries(如果.key ==&#34; car_name&#34;则.key =&#34; name&#34; else。结束)&#39; < / p>