Eu estou familiarizado com "jq" para analisar json.
Eu trabalho com um serviço que produz uma resposta json em que uma das propriedades é uma string json. Como converter esse valor citado em uma string json válida para que eu possa processá-lo com jq?
Por exemplo, se eu apenas visualizar o json bonito e impresso de "jq.", Aqui está um pequeno trecho da saída:
"someJsonString": "{\"date\":\"2018-01-08\", ...
Posso usar jq para obter o valor dessa propriedade, mas preciso converter a cadeia de caracteres citada em json válido "desescapando".
Suponho que eu possa canalizá-lo para o sed, removendo as aspas duplas de abertura e final e removendo todas as barras invertidas (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'
"). Isso parece funcionar, mas não parece ser a solução mais robusta.
Atualização :
Apenas para esclarecer um pouco o que estou fazendo, aqui estão algumas amostras elididas que mostram o que tentei:
% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...
Atualização :
Aqui está um exemplo completamente independente:
% cat stuff.json | jq .
{
"stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"
Atualização :
Se eu tentasse processar essa última saída com uma expressão jq real, ele faria algo assim:
% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)
jq
para obter apenas o valor da propriedade de cadeia, não é devolvê-lo unescaped? Se assim for, basta colocar isso em um novojq
.echo $(jq statement here)
?Respostas:
Há uma
raw
bandeira para issoSaída
fonte
jq
para processamento JSON adicional, enquanto que com a abordagem de Roman você pode continuar a mesmajq
expressão.jq -rc '.stuff.date'
produzjq: error (at <stdin>:0): Cannot index string with string "date"
. No entanto:.stuff | fromjson | .date
funciona bem.Com
jq
afromjson
função:stuff.json
Conteúdo da amostra :A saída:
fonte