Je connais "jq" pour analyser json.
Je travaille avec un service qui produit une réponse json où l'une des propriétés est elle-même une chaîne json. Comment convertir cette valeur entre guillemets en une chaîne json valide afin de pouvoir ensuite la traiter avec jq?
Par exemple, si je regarde simplement le json joliment imprimé de "jq.", Voici un court extrait de la sortie:
"someJsonString": "{\"date\":\"2018-01-08\", ...
Je peux utiliser jq pour obtenir la valeur de cette propriété, mais je dois convertir la chaîne entre guillemets en json valide en la "décompressant".
Je suppose que je pourrais le diriger vers sed, en supprimant les guillemets doubles d'ouverture et de fin et en supprimant toutes les barres obliques inverses (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'
"). Cela semble fonctionner, mais cela ne semble pas être la solution la plus robuste.
Mise à jour :
Juste pour être un peu plus clair sur ce que je fais, voici quelques exemples élidés qui montrent ce que j'ai essayé:
% 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\",...
Mise à jour :
Voici un exemple complètement autonome:
% 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\"}"
Mise à jour :
Si j'ai essayé de traiter cette dernière sortie avec une véritable expression jq, cela fait quelque chose comme ceci:
% 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
pour obtenir uniquement la valeur de la propriété de chaîne, la renvoie-t-elle sans échappement? Si c'est le cas, il vous suffit de le canaliser dans un nouveaujq
.echo $(jq statement here)
?Réponses:
Il y a un
raw
drapeau pour çaSortie
la source
jq
pour un traitement JSON ultérieur, tandis qu'avec l'approche de Roman, vous pouvez continuer la mêmejq
expression.jq -rc '.stuff.date'
produitjq: error (at <stdin>:0): Cannot index string with string "date"
. Cependant:.stuff | fromjson | .date
fonctionne très bien.Avec
jq
lafromjson
fonction:Exemples de
stuff.json
contenu:Le résultat:
la source