Use jq para analisar uma string JSON


87

Estou tentando jqanalisar uma estrutura JSON como:

{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}

Ou seja, um elemento no JSON é uma string com json de escape.

Então, eu tenho algo na linha de $ jq [.c] myFile.json | jq [.id]

Mas isso trava com jq: error: Cannot index string with string

Isso ocorre porque a saída de .c é uma string, não mais JSON. Como faço para que o jq analise essa string?

Minha solução inicial é usar o sed para substituir todos os caracteres de escape ( \":\", \",\"e \"), mas isso é confuso, eu supor que há uma maneira interna para jqfazer isso?

Obrigado!

editar: Além disso, a versão jq disponível aqui é:

$ jq --version
jq version 1.3

Acho que posso atualizá-lo se necessário.


Essa pergunta também ajuda se você estiver procurando por: "Como cancelar o escape de uma string json usando jq?"
k0pernikus

Respostas:


164

jq tem o fromjsonembutido para isso:

jq '.c | fromjson | .id' myFile.json

fromjson foi adicionado na versão 1.4.


2
Obrigado. Isso funciona. Aceito essa resposta, pois é mais 'idiomática' que sinto. Felicidades.
Colin Grogan

@ColinGrogan, por favor.
vbence de

@ColinGrogan: Não vejo nenhuma razão para alterar a resposta aceita, já que você escreveu claramente em sua pergunta que usou a versão 1.3 do jq na qual o fromjsonrecurso não está disponível. Em outras palavras, mesmo que essa resposta seja interessante, ela não responde à pergunta.
Casimir et Hippolyte de

É possível usar isso, mas em um arquivo json inteiro (sem especificar a propriedade .id)?
Florian Castelain

1
@FlorianCastelain sim, omita ou use ponto jq 'fromjson | .' myfile:, onde meuarquivo contém"{\"key\":1, \"word\":\"cat\"}"

41

Você pode usar a saída bruta (-r) que removerá o escape dos caracteres:

jq -r .c myfile.json | jq .id

ADENDO: Tem a vantagem de funcionar no jq 1.3 e superiores; na verdade, ele deve funcionar em todas as versões do jq que possuem a opção -r.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.