使用jq有条件地修改嵌套json

时间:2016-12-28 20:17:23

标签: json nested updates jq

我想修改类似下面的JSON:

{
  "foobar": {
    "a": {
      "adkjfe": {
        "A": 1,
        "foo": "bar"
      }
    },
    "b": {
      "ekjaei": {
        "A": 2,
        "bar": "foo"
      }
    }
  }
}

如果A = 1,则向A的父级添加更多数据{"baz": ["bing", "bop"]}。假设我不知道父键,同时保持json的其余部分不受影响。我尝试过很多不同的事情,包括:

.foobar | .. | .. | .[] | if select(.A==1) then . += {"baz": "bing"} else . end 

这给了我一个错误,只有我修改过的部分。

在这种情况下,我希望看到的结果是:

{
  "foobar": {
    "a": {
      "adkjfe": {
        "A": 1,
        "foo": "bar",
        "baz": ["bing", "bop"]
      }
    },
    "b": {
      "ekjaei": {
        "A": 2,
        "bar": "foo"
      }
    }
  }
}

2 个答案:

答案 0 :(得分:2)

仅选择类型为object且符合条件(A == 1)的字段:

jq '(.foobar | .. | select(type == "object" and .A == 1)) |= .+ {"baz": ["bing", "bop"]}' test.json

过滤器查询周围的()注意整个文档将与更新的字段一起返回,而不仅仅是您的子文档

答案 1 :(得分:2)

一般情况下,出于效率原因,最好尽可能避免使用..。在目前的情况下,以下将完成这项工作:

(.foobar[][] | select(.A == 1)) |= .+ {"baz":["bing", "bop"]}