Às vezes, preciso escrever strings JSON contendo um valor de string que é, em si, uma string JSON. Por exemplo, no seguinte objeto JSON:
echo '{"rec" : " {\"id\": 1, \"name\": \"x\"}" }' | jq .
{
"rec": " {\"id\": 1, \"name\": \"x\"}"
}
o valor em "rec"
é um json em formato de string {\"id\": 1, \"name\": \"x\"}"
.
É tedioso escrever essas strings JSON com escape, pois é preciso escapar cada aspa dupla "
para \"
.
Minha pergunta é:
Dado o conteúdo { "id": 1, "name": "x"}
, existe uma maneira automática usando bash/jq para escapar corretamente as aspas e fazer com que o formato entre aspas possa ser usado como um valor de string JSON "{\"id\": 1, \"name\": \"x\"}"
?
Existem basicamente duas maneiras.
Dê a carga JSON
jq
como uma string:Observe que isso
jq
não validará a string fornecida de forma alguma e a preservará como estava, com excesso de espaços em branco e tudo.Forneça
jq
a carga útil como um documento JSON de entrada e usetojson
para torná-la em string:Aqui,
jq
ele reclamaria se o fragmento JSON fornecido fosse inválido e também o "compactaria" removendo espaços em branco desnecessários.A mesma coisa, mas lendo a entrada padrão:
A diferença entre
input
einputs
é queinput
lê um único objeto da entrada dejq
, enquantoinputs
lê todos os objetos restantes.Ou, como é mais curto, puxe a entrada diretamente para dentro
tojson
removendo a opção-n
/--null-input
:Isso absorveria todos os dados da entrada de
jq
(assim como ao usarinputs
, com-n
) e os inseriria como o valor darec
chave, viatojson
.Para fazer o oposto, ou seja, decodificar a carga útil stringificada, use
fromjson
:Observe que
echo
, em geral , não é o melhor utilitário para passar documentos JSON parajq
(ou para qualquer outro lugar, nesse caso), pois dependendo do seu shell e sua configuração, ele pode escolher expandir strings como\n
e\t
para novas linhas e tabulações literais, o que quebraria a formatação do documento fornecido.Use
--arg
para passar strings literais, que se tornarão $variáveis em jq: