重命名数组内对象的属性

时间:2017-06-05 11:08:54

标签: jq

这是我的输入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多个属性,我不想在规则中提及所有这些属性。

数组中可以有多个对象。

5 个答案:

答案 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>

相关问题