Como converter json string embutido (citado) para json

8

Estou familiarizado com o "jq" para analisar o json.

Eu trabalho com um serviço que produz uma resposta json em que uma das propriedades é uma cadeia json. Como faço para converter esse valor entre aspas em uma string json válida para que eu possa processá-lo com jq?

Por exemplo, se eu apenas visualizar o json simples e bem impresso de "jq.", aqui está um pequeno trecho da saída:

"someJsonString": "{\"date\":\"2018-01-08\", ...

Eu posso usar jq para obter o valor dessa propriedade, mas eu preciso converter a string entre aspas para validar o json "sem escape".

Suponho que eu poderia canalizá-lo para o sed, removendo as aspas duplas de abertura e término e removendo todas as barras invertidas (" sed -e 's/^"//' -e 's/"$//' -e 's/\//g' "). Isso parece funcionar, mas isso não parece ser a solução mais robusta.

Atualizar :

Só para ficar um pouco mais claro sobre o que estou fazendo, aqui estão alguns exemplos que mostram o que eu 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\",...

Atualizar :

Veja um exemplo completamente autônomo:

% 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\"}"

Atualizar :

Se eu tentei processar a última saída com uma expressão jq real, ela faz 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)
    
por David M. Karr 08.01.2018 / 22:25

2 respostas

7

Há um sinalizador raw para isso

    -r      output raw strings, not JSON texts;

jq -rc .stuff stuff.json

Saída

{"date":"2018-01-08"}
    
por 27.04.2018 / 20:31
9

Com a função jq de fromjson :

Amostra stuff.json contents:

{
  "stuff": "{\"date\":\"2018-01-08\"}"
}
jq -c '.stuff | fromjson' stuff.json

A saída:

{"date":"2018-01-08"}
    
por 08.01.2018 / 22:49

Tags