Use jq para analizar una cadena JSON

87

Estoy tratando de jqanalizar una estructura JSON como:

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

Es decir, un elemento en JSON es una cadena con json de escape.

Entonces, tengo algo parecido a $ jq [.c] myFile.json | jq [.id]

Pero eso choca con jq: error: Cannot index string with string

Esto se debe a que la salida de .c es una cadena, no más JSON. ¿Cómo hago para que jq analice esta cadena?

Mi solución inicial es usar sed para reemplazar todos los caracteres de escape ( \":\", \",\"y \") pero eso es complicado, ¿supongo que hay una forma incorporada jqpara hacer esto?

¡Gracias!

editar: Además, la versión jq disponible aquí es:

$ jq --version
jq version 1.3

Supongo que podría actualizarlo si fuera necesario.

Colin Grogan
fuente
Esta pregunta también ayuda si está buscando: "¿Cómo anular el escape de la cadena json usando jq?"
k0pernikus

Respuestas:

164

jq tiene el fromjsonincorporado para esto:

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

fromjson se agregó en la versión 1.4.

jwodder
fuente
2
Gracias. Esto funciona. Aceptaré esta respuesta, ya que me parece más 'idiomaitic'. Salud.
Colin Grogan
@ColinGrogan por favor hazlo.
vbence
@ColinGrogan: No veo ninguna razón para cambiar la respuesta aceptada ya que claramente escribió en su pregunta que usó la versión 1.3 de jq en la que la fromjsonfunción no está disponible. En otras palabras, incluso si esta respuesta es interesante, no responde a la pregunta.
Casimir et Hippolyte
¿Es posible usar esto pero en un archivo json completo (sin especificar la propiedad .id)?
Florian Castelain
1
@FlorianCastelain sí, omítalo o use dot : jq 'fromjson | .' myfile, donde myfile contiene"{\"key\":1, \"word\":\"cat\"}"
41

Puede usar la salida sin formato (-r) que eliminará los caracteres:

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

ADENDA: Tiene la ventaja de que funciona en jq 1.3 y posteriores; de hecho, debería funcionar en todas las versiones de jq que tengan la opción -r.

Casimir et Hippolyte
fuente