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 simple et bien 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 rediriger 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)
Il y a un indicateur raw
pour cela
-r output raw strings, not JSON texts;
jq -rc .stuff stuff.json
Production
{"date":"2018-01-08"}
Avec la fonction jq
de fromjson
:
Échantillon stuff.json
Contenu:
{
"stuff": "{\"date\":\"2018-01-08\"}"
}
jq -c '.stuff | fromjson' stuff.json
Le résultat:
{"date":"2018-01-08"}