Table des matières
jq
jq est un programme en ligne de commande pour traiter du JSON. Le site officiel. An Introduction to JQ
Installation
Ubuntu:
$ sudo apt-get install jq
macOS:
$ brew install jq
Utilisation
Pour chercher certaines occurrences d'un JSON selon certaines valeurs, on peut utiliser select()
.
En entrée, on a par exemple:
[ { "id": 1, "name": "Google", "country": "USA", "employees": 100000 }, { "id": 2, "name": "Samsung", "country": "South Korea", "employees": 500000 }, { "id": 3, "name": "Sony", "country": "Japan", "employees": 750000 }, { "id": 3, "name": "IBM", "country": "USA", "employees": 250000 } ]
$ cat companies.json | jq 'map(select(.country == "USA" and .employees >= 200000))'
En sortie nous aurons donc:
[ { "id": 3, "name": "IBM", "country": "USA", "employees": 250000 } ]
Un autre exemple, pris d'une question sur SO, si on a :
{ "response": { "result": { "Countries": { "row": [ { "no": "1", "FL": [ { "content": "USA", "val": "Country" }, { "content": "Barack Obama", "val": "President" } ] }, { "no": "2", "FL": [ { "content": "Cuba", "val": "Country" }, { "content": "Raul Castro", "val": "President" } ] } ] } } } }
On peut faire:
$ cat data.json | jq '.response.result.Countries.row[].FL | {country: .[0].content, president: .[1].content, val: .[1].val} | select(.country == "USA") | {president, val}'
To Entries avec Map
Pour pivoter les clés d'objets en valeurs, par exemple dans ce cas-ci:
{ "items": { "01": { "name": "Name of 01", "spec": { "name": "Specific name 01" } }, "02": { "name": "Name of 02", "spec": { "name": "Specific name 02" } } } }
On peut utiliser to_entries
pour que les items 01 et 02 soient des valeurs de key
et l'objet lui-même soit une valeur:
$ cat ./test.json | jq '.items | to_entries' [ { "key": "01", "value": { "name": "Name of 01", "spec": { "name": "Specific name 01" } } }, { "key": "02", "value": { "name": "Name of 02", "spec": { "name": "Specific name 02" } } } ]
Avec map
, on peut alors façonner un objet comme on le veut:
$ cat ./test.json | jq '.items | to_entries | map({ itemCode: .key, name: .value.name, specName: .value.spec.name })' [ { "itemCode": "01", "name": "Name of 01", "specName": "Specific name 01" }, { "itemCode": "02", "name": "Name of 02", "specName": "Specific name 02" } ]
Clés d'un fichier de traductions
On peut obtenir les clés de fichiers de traductions (qui sont utilisés pour référencer une chaine à traduire) avec ce jq:
$ cat src/assets/i18n/fr.json | jq -c 'path(..)|[.[]|tostring]|join(".")|select(. != "")|select(index("."))'
Le premier select()
permet d'enlever la première clé vide, et l'autre permet d'enlever les clés parents ou racines (ne sont pas nécessairement associé à quelconque texte).
Clés avec caractères spéciaux
Si la clé que l'on veut sélectionner a des caractères spéciaux, la sélection doit se faire en single-quotes et la clé en double-quotes, par exemple, pour trouver la version d'un package npm:
cat ./package.json | jq '.dependencies."@scope/package-name"'