web-dev-qa-db-fra.com

Utiliser jq pour analyser une chaîne JSON

J'essaye d'obtenir que jq analyse une structure JSON comme:

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

Autrement dit, un élément dans le JSON est une chaîne avec json échappé.

Donc, j'ai quelque chose comme $ jq [.c] myFile.json | jq [.id]

Mais cela se bloque avec jq: error: Cannot index string with string

En effet, la sortie de .c est une chaîne, pas plus JSON. Comment obtenir jq pour analyser cette chaîne?

Ma solution initiale consiste à utiliser sed pour remplacer tous les caractères d'échappement (\":\", \",\" et \") mais c'est désordonné, je suppose qu'il existe un moyen intégré à jq pour le faire?

Merci!

edit: De plus, la version jq disponible ici est:

$ jq --version
jq version 1.3

Je suppose que je pourrais le mettre à jour si nécessaire.

53
Colin Grogan

jq a le fromjson intégré pour cela:

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

fromjson a été ajouté dans la version 1.4.

100
jwodder

Vous pouvez utiliser la sortie brute (-r) qui déséchappera les caractères:

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

ADDENDUM: Cela a l'avantage de fonctionner en jq 1.3 et supérieur; en effet, cela devrait fonctionner dans toutes les versions de jq qui ont l'option -r.

30