如何使用 jq 更改 json 数组字段中的值?

how to alter values in a field of a json array with jq?

我想使用 jq 命令行实用程序将不同的值分配给 json 数组中的同一字段,

举个例子:

myjson='[{"a":1,"b":"john"}, {"a":2, "b":"mark"}]'

通过以下我可以为所有字段分配相同的值

echo $myjson | jq '[.[] | .a=5 ]'

我也可以增加它:

echo $myjson | jq '[.[] | .a+=2]'

但是如何将两个新的不同值(如 7 和 3)分配给数组中对象中的两个 a 字段?

使用以下或类似方法将整个数组分配给每个变量

echo $myjson | jq '[.[] | .a=[7,3]]'

按照您的方案,没有这样的解决方案,因为您的所有过滤器都“一次”处理所有项目,这意味着独立于它们在数组中的位置。这就是为什么您只能将它们设置为相同的值或以相同的方式处理它们,而不使用它们的索引,这将需要解决要使用的特定新值。

为了实现您的目标,您必须遍历数组索引或对齐的元素。

前者可以通过使用 reduce 迭代新值并结合 to_entries 访问它们的位置(键),并使用键和值连续更新输入数组的项目来实现.

reduce ([3,7] | to_entries[]) as $i (.; .[$i.key].a = $i.value)
[
  {
    "a": 3,
    "b": "john"
  },
  {
    "a": 7,
    "b": "mark"
  }
]

Demo

后者可以使用 transpose 内置函数实现,它通过匹配两个(或任意数量的)数组的索引来对齐它们的元素,并将它们作为组合数组输出。

[[3,7], .] | transpose | map(.[0] as $a | .[1] | .a = $a)
[
  {
    "a": 3,
    "b": "john"
  },
  {
    "a": 7,
    "b": "mark"
  }
]

Demo


注意:您的示例过滤器可以分别压缩为 .[].a |= 5 (Demo) and .[].a += 2 (Demo)。