Estoy familiarizado con "jq" para analizar json.
Trabajo con un servicio que produce una respuesta json donde una de las propiedades es en sí misma una cadena json. ¿Cómo convierto ese valor citado en una cadena json válida para que luego pueda procesarlo con jq?
Por ejemplo, si acabo de ver el json bastante impreso de "jq.", Aquí hay un breve extracto de la salida:
"someJsonString": "{\"date\":\"2018-01-08\", ...
Puedo usar jq para obtener el valor de esa propiedad, pero necesito convertir la cadena entre comillas a json válida "quitándola".
Supongo que podría canalizarlo a sed, eliminando las comillas dobles de apertura y finalización, y eliminando todas las barras invertidas (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'
"). Eso parece funcionar, pero esa no parece ser la solución más sólida.
Actualización :
Solo para ser un poco más claro sobre lo que estoy haciendo, aquí hay un par de muestras eliminadas que muestran lo que he intentado:
% 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\",...
Actualización :
Aquí hay un ejemplo completamente independiente:
% 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\"}"
Actualización :
Si intenté procesar esa última salida con una expresión jq real, hace algo como esto:
% 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)
jq
para obtener solo el valor de la propiedad de cadena, ¿la devuelve sin escape? Si es así, simplemente póngalo en una nuevajq
.echo $(jq statement here)
?Respuestas:
Hay una
raw
bandera para estoSalida
fuente
jq
para un mayor procesamiento JSON, mientras que con el enfoque de Roman puede continuar la mismajq
expresión.jq -rc '.stuff.date'
producejq: error (at <stdin>:0): Cannot index string with string "date"
. Sin embargo:.stuff | fromjson | .date
funciona bien.Con
jq
lafromjson
función de:stuff.json
Contenido de muestra :La salida:
fuente