test online from filters array json nested updates jq

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"]}