使用jq基于键数组修改JSON值

时间:2016-03-22 08:46:05

标签: json bash jq

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

例如,我有这个JSON对象:

update_keys = ["bar", "baz"]

以及以下变量:

.foo = (.foo | 
        to_entries | 
        map(if .key == "bar" or .key == "baz" 
        then . + { "value":"X" } 
        else . 
        end) |
        from_entries)

我想说'将update_keys中的键值更改为X'。

以下作品:

if .key == "bar" or .key == "baz"

但我代替if .key in update_keys寻找说$wsquery = array( 'faculty_id' => $uid); $tid = array('id'=>1); $tname = 'imtd_faculty_in_focus'; $wpdb->update( $tname, $wsquery , $tid); 或类似逻辑的方法。

3 个答案:

答案 0 :(得分:1)

你走了。

过滤

.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
  }
}

查看食谱,了解jq用法的更多收件人和技巧:
  https://github.com/stedolan/jq/wiki/Cookbook

答案 1 :(得分:0)

以下使用--argjson参数化update_keys和index/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"
  }
}

答案 2 :(得分:0)

在这个问题中,因为$update_keys只是一个数组,所需要的只是

 .foo[ $update_keys[] ] = "X"

e.g。如果

  ["bar","baz"] as $update_keys
| .foo[ $update_keys[] ] = "X"

位于filter.jqdata.json包含(略微更正的)数据

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

然后

jq -M -f filter.jq data.json

产生

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

如果您想传递更新密钥的值而不是在脚本中定义它,您可以轻松地使用--argjson作为peak的答案显示。