Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用jq基于密钥数组修改JSON值_Json_Bash_Jq - Fatal编程技术网

使用jq基于密钥数组修改JSON值

使用jq基于密钥数组修改JSON值,json,bash,jq,Json,Bash,Jq,我需要使用jq更改JSON对象中一组键(在变量中定义)的值 例如,我有一个JSON对象: { foo: { bar: 1, baz: 2, qux: 3 } } 以及以下变量: update_keys = ["bar", "baz"] 我想说‘将update_keys中的键的值更改为X’ 以下工作: .foo = (.foo | to_entries | map(if .key == "bar

我需要使用jq更改JSON对象中一组键(在变量中定义)的值

例如,我有一个JSON对象:

{
    foo: {
        bar: 1,
        baz: 2,
        qux: 3
    }
}
以及以下变量:

update_keys = ["bar", "baz"]
我想说‘将update_keys中的键的值更改为X’

以下工作:

.foo = (.foo | 
        to_entries | 
        map(if .key == "bar" or .key == "baz" 
        then . + { "value":"X" } 
        else . 
        end) |
        from_entries)
但是,我不是在寻找一种方式来表示if.key==“bar”或.key==“baz”,而是在寻找一种方式来表示if.key in update\u keys,或者类似的逻辑

过滤器

.foo |= with_entries( .value = if ([.key] | inside(["bar", "baz"])) then "X" else .value end )
输入

{
    "foo": {
        "bar": 1,
        "baz": 2,
        "qux": 3
    }
}
{
  "foo": {
    "bar": "X",
    "baz": "X",
    "qux": 3
  }
}
输出

{
    "foo": {
        "bar": 1,
        "baz": 2,
        "qux": 3
    }
}
{
  "foo": {
    "bar": "X",
    "baz": "X",
    "qux": 3
  }
}
查看食谱,了解更多关于
jq
用法的方法和技巧:

这里有一个稍微不同的方法,使用
--argjson
参数化更新键和
索引/1

$ cat update.jq
.foo |= with_entries( . as $in 
          | if $update_keys | index($in.key) then .value = "X" else empty end)

$ update_keys='["bar", "baz"]'

$ jq --argjson update_keys "$update_keys" -f update.jq input.json

Output:

{
  "foo": {
    "bar": "X",
    "baz": "X"
  }
}

在这个问题中,因为
$update\u keys
只是一个数组,所以所需要的就是

 .foo[ $update_keys[] ] = "X"
e、 g.如果

  ["bar","baz"] as $update_keys
| .foo[ $update_keys[] ] = "X"
filter.jq
data.json
中包含(稍微更正的)数据

然后

产生

{
  "foo": {
    "bar": "X",
    "baz": "X",
    "qux": 3
  }
}

如果您想传递更新键的值,而不是在脚本中定义它,您可以很容易地使用
--argjson
,正如您的回答所示。

您能详细说明结果应该是什么吗。不确定是否要扩展更新密钥或修改。foo我要更新foo,更改更新密钥数组中定义的密钥的值(所有密钥更改为相同的值)是
update\u keys
已经是您在
jq
中定义的变量了吗?@TomFenech不,我对jq很陌生。。不知道我们可以有变量,也不知道这个工具。谢谢你的指点!