【问题标题】:How to use jq to selectively update JSON array, referring to parent properties如何使用jq选择性更新JSON数组,参考父属性
【发布时间】:2023-03-26 22:02:02
【问题描述】:

我正在尝试使用jq 选择性地更改嵌套在数组中的对象的单个属性,从而保持数组的其余部分不变。生成的属性值需要向上引用父对象的某个属性。

以这个数组为例:

[
  {
    "name": "keep_me"
  },
  {
    "name": "leave_unchanged",
    "list": [
      {
        "id": "1",
        "key": "keep_this"
      }
    ]
  },
  {
    "name": "a",
    "list": [
      {
        "id": "2",
        "key": "also_keep_this"
      },
      {
        "id": "42",
        "key": "replace_this"
      }
    ]
  }
]

我想更改最后一个键(replace_this)的值,使用父对象的name 属性生成类似generated_value_for_a_42 的值。

这里的关键问题似乎是保持数组的其余部分保持不变,同时更新特定的元素。但是,将“树上”提到父属性的需要使事情变得复杂。 我尝试将更改包装在括号中以保留未触及的元素,但随后在将变量绑定(使用as)到正确的范围以访问父属性时遇到了麻烦。所以我要么最终丢弃了数组或对象的一部分,要么得到了关于变量绑定的错误。

【问题讨论】:

    标签: arrays json jq


    【解决方案1】:

    This answer 帮助我朝着正确的方向前进。重要的学习是在正确的位置使用|=,并将过滤器包裹在if p then f else . 中以保持不变的元素。

    下面的 jq 脚本解决了这个任务:

    map(.name as $name |
        if has("list")
        then .list |= map(if .key | contains("keep") | not
                          then .key = "generated_value_for_" + $name + "_" + .id
                          else .
                          end)
        else .
        end)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多