Utilisez jq pour analyser une chaîne JSON

87

J'essaie d' jqanalyser une structure JSON comme:

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

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

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

Mais ça plante avec jq: error: Cannot index string with string

C'est parce que la sortie de .c est une chaîne, pas plus JSON. Comment puis-je demander à jq d'analyser cette chaîne?

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

Merci!

edit: Aussi, la version jq disponible ici est:

$ jq --version
jq version 1.3

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

Colin Grogan
la source
Cette question est également utile si vous recherchez: "Comment unescape json string en utilisant jq?"
k0pernikus

Réponses:

164

jq a la fonction fromjsonintégrée pour cela:

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

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

jwodder
la source
2
Merci. Cela marche. J'accepte cette réponse, car c'est plus «idiomaitique» que je ressens. À votre santé.
Colin Grogan le
@ColinGrogan s'il vous plaît.
vbence
@ColinGrogan: Je ne vois aucune raison de changer la réponse acceptée puisque vous avez clairement écrit dans votre question que vous avez utilisé la version 1.3 de jq dans laquelle la fromjsonfonctionnalité n'est pas disponible. En d'autres termes, même si cette réponse est intéressante, elle ne répond pas à la question.
Casimir et Hippolyte
Est-il possible de l'utiliser mais sur un fichier json entier (sans spécifier la propriété .id)?
Florian Castelain
1
@FlorianCastelain oui, omettez-le ou utilisez dot jq 'fromjson | .' myfile:, where myfile contains"{\"key\":1, \"word\":\"cat\"}"
41

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

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

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

Casimir et Hippolyte
la source