online - Modificando json anidado condicionalmente usando jq
json filter online (2)
Seleccione solo los campos que son de tipo object
y que coinciden con su condición ( A == 1
):
jq ''(.foobar | .. | select(type == "object" and .A == 1)) |= .+ {"baz": ["bing", "bop"]}'' test.json
La ()
alrededor de la consulta de filtro se ocupa de que todo el documento se devuelva con los campos actualizados y no solo con su subdocumento.
Me gustaría modificar algo como el siguiente JSON:
{
"foobar": {
"a": {
"adkjfe": {
"A": 1,
"foo": "bar"
}
},
"b": {
"ekjaei": {
"A": 2,
"bar": "foo"
}
}
}
}
para agregar más datos, diga {"baz": ["bing", "bop"]}
al padre de A si es A = 1. Suponiendo que no conozco la tecla padre mientras no dejo el resto del json. He intentado muchas cosas diferentes, incluyendo:
.foobar | .. | .. | .[] | if select(.A==1) then . += {"baz": "bing"} else . end
lo cual me da un error y solo mi sección modificada.
El resultado, en este caso, que me gustaría ver es:
{
"foobar": {
"a": {
"adkjfe": {
"A": 1,
"foo": "bar",
"baz": ["bing", "bop"]
}
},
"b": {
"ekjaei": {
"A": 2,
"bar": "foo"
}
}
}
}
En general, es mejor evitar ..
si es posible, por razones de eficiencia. En el presente caso, lo siguiente hará el trabajo:
(.foobar[][] | select(.A == 1)) |= .+ {"baz":["bing", "bop"]}