extraindo json dentro de json com jq [duplicar]
Freqüentemente, desejo analisar json com o jqcomando, mas um dos valores dentro do json é uma string com escape de json.
por exemplo, se eu gerar dados com python assim:
import json
inner = {'a': 'b'}
outer = {'x': json.dumps(inner)}
json.dumps(outer)
Eu recebo:
{"x": "{\"a\": \"b\"}"}
Como faço para "b"usar o jqcomando?
$ echo '{"x": "{\"a\": \"b\"}"}' | jq .x
"{\"a\": \"b\"}"
Ok, esse é o primeiro passo. Mas o resultado não é um dicionário json. É uma string que precisa ser escapada e analisada em json.
jq .x.a lança um erro: jq: error (at <stdin>:1): Cannot index string with string "a"
Existe um argumento que eu possa acrescentar jqpara encadear duas jqetapas? Ou existe outro comando que posso usar no lugar?
por exemplo
echo '{"x": "{\"a\": \"b\"}"}' | jq .x | jq --some-argument .a
ou
echo '{"x": "{\"a\": \"b\"}"}' | jq .x | something-else | jq .a
Respostas
O seguinte resolve:
echo '{"x": "{\"a\": \"b\"}"}' | jq -r .x | jq .a
Aqui, a -retapa garante que a saída sejam strings brutas , não textos JSON. Portanto:
"{\"a\": \"b\"}" -> {"a": "b"},
onde esta "string bruta" pode ser subsequentemente tomada como entrada JSON para jq .a, retornando "b"(ou bquando usada com -rflag).
EDIT : Ligar jqduas vezes não é o ideal (obrigado @peak), o comando anterior pode ser combinado nesta oneliner
| jq -r '.x|fromjson.a'