Outils pour utilisateurs

Outils du site


web:javascript:json:jq

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).

Ressources

web/javascript/json/jq.txt · Dernière modification : 2023/06/12 15:05 de sgariepy