Eu tenho o seguinte arquivo JSON localizado em /tmp/target.json
:
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
...
}
}
Eu quero adicionar um novo par de valor de chave para que fique da seguinte forma:
{
"compileOnSave": false,
"compilerOptions": {
"skipLibCheck": true,
"baseUrl": "./",
...
}
}
Eu uso o seguinte comando, mas não funciona:
jq --argjson addobj '{"skipLibCheck": "true"}' '
.compilerOptions{} |= $addobj
' /tmp/target.json
Eu me dá este erro:
jq: error: syntax error, unexpected '{', expecting $end (Unix shell quoting issues?) at <top-level>, line 2:
.compilerOptions{} |= $addobj
jq: 1 compile error
O que eu fiz errado? Como posso fazê-lo funcionar como pretendido?
Assim:
A maneira mais fácil de adicionar a chave com seu valor foi abordada em outra resposta . Essa resposta adiciona a chave ao final da lista de chaves no
compilerOptions
objeto. Normalmente, a ordem das chaves não importa e, se você precisar de coisas ordenadas de uma maneira específica, usará um array . No entanto, estou percebendo que você (por qualquer motivo) espera que a chave seja adicionada primeiro, antes dabaseUrl
chave existente.Podemos adicionar a chave nessa posição, em vez de adicionar a nova chave ao objeto existente, em vez disso, adicionar as chaves do objeto existente ao final da nova chave. Assim, dado o documento JSON existente,
... podemos querer usar
Dado nosso exemplo de documento acima, isso geraria
A
$ARGS.named
coisa é um objeto que contém os pares chave-valor definidos com--arg
e/ou--argjson
na linha de comando. No exemplo acima, isso seria{"skipLibCheck":true}
. Observe que o$ARGS
recurso foi introduzido após a versão 1.5 dojq
.Com a versão 1.5 mais antiga do
jq
, você pode usarUse
--arg
em vez de--argjson
se quiser que o valor seja a stringtrue
em vez do valor booleano especialtrue
.O seguinte fornece uma maneira alternativa de adicionar a chave no final (ao que é mencionado na outra resposta), que segue o mesmo padrão do comando acima. Observe que também estou mudando para using
--arg
here para inserirtrue
como uma string, apenas para mostrar como fica.... o que lhe daria
Com a versão 1.5 mais antiga do
jq
, você pode usar