extraindo json dentro de json com jq [duplicar]

Nov 03 2020

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

1 CasperDijkstra Nov 03 2020 at 07:15

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'