Estou tentando editar uma especificação OpenAPI alterando todos os parâmetros para serem anuláveis. Uma definição de parâmetro se parece com isso:
{
"name": "foo",
"required": true,
"type": "string"
}
Eles estão contidos em um parameters
array que pode estar em qualquer lugar do documento. O que eu preciso é anexar "x-nullable": true
a qualquer parâmetro que contenha uma type
propriedade.
Dados de amostra:
{
"parameters": [
{"notype": "x"},
{"type": "x"}
],
"foo": {
"parameters": [
{"type": "y"}
]
},
"bar": {
"baz": {
"parameters": [
{"type": "z"}
]
}
}
}
Saída desejada:
{
"parameters": [
{"notype": "x"},
{
"type": "x",
"x-nullable": true
}
],
"foo": {
"parameters": [
{
"type": "y",
"x-nullable": true
}
]
},
"bar": {
"baz": {
"parameters": [
{
"type": "z",
"x-nullable": true
}
]
}
}
}
O mais próximo que consegui chegar foi isto :
.. | (.parameters[] | select(.type)) += {"x-nullable":true}
Ele altera com sucesso um dos itens no meu documento de teste, mas os resultados são inconsistentes e parecem ser baseados na estrutura que escolhi para dados de amostra.
A
jq
expressão a seguir aplica uma atualização ao valor de todasparameters
as chaves encontradas no documento. Supõe-se que aparameters
chave sempre se refere a um array. A atualização atribuitrue
àx-nullable
chave todos os elementos do array com umatype
chave.A recursão é feita com
walk()
(aplica uma expressão a cada valor no documento, recursivamente) em vez do operador decente recursivo..
(extrai cada valor do documento, recursivamente).É mais seguro usar
select(has("type"))
para selecionar objetos que tenham otype
campo, pois usarselect(.type)
perderia objetos cujotype
valor erafalse
ounull
.Testando no documento de exemplo na pergunta: