【问题标题】:Rename property of an object inside array重命名数组内对象的属性
【发布时间】:2017-06-05 11:08:54
【问题描述】:

这是我的输入 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”属性重命名为“name”,并且在规则中不提及所有其他属性(在本例中为“saleDate”)。我最终可能会在对象中拥有 50 多个属性,并且我不想在规则中提及所有这些属性。

数组中可以有多个对象。

【问题讨论】:

    标签: jq


    【解决方案1】:

    在确保只更改特定键名的同时保留键的顺序:

    jq '.description[] |= with_entries(if .key == "car_name" then .key = "name" else . end)'
    

    【讨论】:

      【解决方案2】:

      这是你想要的吗?

       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处的键值对

      【讨论】:

      • 是的!谢谢你。现在看起来很简单。
      【解决方案3】:

      我刚刚从另一个问题的答案中了解到 +=。在这里也可以。

      jq '.description[] |= (select(has("car_name")) += {"name":.car_name} | del(.car_name))'
      

      select 函数选择满足条件的对象。然后我们添加和删除这些对象。

      【讨论】:

      • 是的。但是,我发现这种重命名字段的方式存在一个问题。它最终将新字段放置在与以前不同的位置。那是因为我们正在创建一个新字段并删除旧字段。我希望有一种方法可以真正重命名该字段,确保我的输出 json 在属性顺序方面看起来与输入相似。
      • 不知道jq能不能做到。它可能;我真的不知道。我想你可以做类似 sed 's/"car_name"/"name"/g'
      • 查看上面的答案以获得 jq 解决方案。
      【解决方案4】:

      这似乎在保持顺序的同时有效。

      jq '.description[] |= with_entries( .key |= gsub("car_name"; "name") )'
      

      jq manual 解释了 with_entries 的作用。

      信用在高峰时归answer to a similar question

      【讨论】:

      • 警告:这可能不仅仅改变名为“car_name”的键。
      【解决方案5】:
      jq '.description[] |= with_entries(if .key == "car_name" then .key = "name" else . end)'
      

      【讨论】:

        猜你喜欢
        • 2020-06-02
        • 2021-10-30
        • 2021-01-22
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 2020-04-19
        • 2011-11-10
        • 2014-04-15
        相关资源
        最近更新 更多