【问题标题】:Modify keys in multiple nested objects/arrays修改多个嵌套对象/数组中的键
【发布时间】:2018-10-01 09:50:18
【问题描述】:

我想修改 json 中所有 x 键的值,如下所示:

{
  "a": {
    "b": {
      "c": [
        {
          "0": {
            "x": 23,
            "name": "AS"
          }
        },
        {
          "1": {
            "x": 23,
            "name": "AS"
          }
        },
        {
          "2": {
            "x": 23,
            "name": "Fe"
          }
        },
        {
          "3": {
            "x": 23,
            "name": "Pl"
          }
        }
      ]
    }
  }
}

我尝试了多种方法,但我无法修改x 的值并因此获得完整的json。我所做的只是修改x 的值并获得最后一个数组。

这是我最接近的结果:https://jqplay.org/s/Wx741btZOg

【问题讨论】:

    标签: arrays json nested jq


    【解决方案1】:

    使用|= 可以简单地通过编写来执行更新:

    .a.b.c |= [.[]|.[].x=97]
    

    或者更清楚:

    .a.b.c |= map(.[].x=97)
    

    如果你真的想“修改所有 x 键的值”,那么你可以使用 walk:

    walk(if type == "object" and has("x") then .x=97 else . end)
    

    (如果你的 jq 没有walk,那么你可以从网上获取它的def,例如从builtin.jq

    【讨论】:

      【解决方案2】:

      要将所有x 值更改为97,您可以试试这个jq 命令:

      <file jq '.a.b.c as $in | .a.b.c=[ $in[] | .[].x=97 ]'
      

      该命令将对象的父对象存储在变量$in 中,以便您可以修改其子元素之一。

      【讨论】:

        猜你喜欢
        • 2021-10-27
        • 2020-05-04
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        相关资源
        最近更新 更多