使用 jq 有条件地修改嵌套 json
Modifying nested json conditionally using jq
我想修改如下JSON:
{
"foobar": {
"a": {
"adkjfe": {
"A": 1,
"foo": "bar"
}
},
"b": {
"ekjaei": {
"A": 2,
"bar": "foo"
}
}
}
}
要添加更多数据,如果 A=1,请说 {"baz": ["bing", "bop"]}
到 A 的父级。假设我不知道父密钥,而 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"
}
}
}
}
Select 仅类型为 object
且符合您的条件 (A == 1
) 的字段:
jq '(.foobar | .. | select(type == "object" and .A == 1)) |= .+ {"baz": ["bing", "bop"]}' test.json
过滤器查询周围的 ()
注意整个文档将返回更新的字段,而不仅仅是您的子文档
一般来说,为了提高效率,最好尽可能避免使用 ..
。在目前的情况下,以下将完成这项工作:
(.foobar[][] | select(.A == 1)) |= .+ {"baz":["bing", "bop"]}
我想修改如下JSON:
{
"foobar": {
"a": {
"adkjfe": {
"A": 1,
"foo": "bar"
}
},
"b": {
"ekjaei": {
"A": 2,
"bar": "foo"
}
}
}
}
要添加更多数据,如果 A=1,请说 {"baz": ["bing", "bop"]}
到 A 的父级。假设我不知道父密钥,而 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"
}
}
}
}
Select 仅类型为 object
且符合您的条件 (A == 1
) 的字段:
jq '(.foobar | .. | select(type == "object" and .A == 1)) |= .+ {"baz": ["bing", "bop"]}' test.json
过滤器查询周围的 ()
注意整个文档将返回更新的字段,而不仅仅是您的子文档
一般来说,为了提高效率,最好尽可能避免使用 ..
。在目前的情况下,以下将完成这项工作:
(.foobar[][] | select(.A == 1)) |= .+ {"baz":["bing", "bop"]}