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"'
