Traitement de données JSON avec jq

LinuxBeginner
Pratiquer maintenant

Introduction

Bienvenue dans le laboratoire de programmation Linux jq! Dans ce laboratoire, vous allez découvrir comment utiliser jq, un processeur JSON léger et polyvalent pour la ligne de commande. Imaginez jq comme sed, mais conçu spécifiquement pour les données JSON. Il vous permet de découper, filtrer, mapper et transformer facilement des données structurées. Ce laboratoire est conçu pour vous guider de l'utilisation de base à l'utilisation avancée de jq grâce à des exemples pratiques que vous pouvez appliquer dans des scénarios du monde réel, comme le traitement de données JSON provenant d'API ou de fichiers de configuration.

Imaginez que vous planifiez un voyage en Chine et que vous utilisez une application de voyage qui fournit des détails sur diverses attractions, y compris leurs emplacements, leurs horaires d'ouverture et leurs avis. Le backend de l'application stocke ces données au format JSON. Votre tâche consiste à extraire des informations spécifiques pour planifier efficacement votre voyage. Ce laboratoire vous montrera comment utiliser jq pour interroger et manipuler ces données JSON, vous permettant d'identifier rapidement les attractions parfaites à visiter.

Requêtage JSON de base

Commençons par apprendre à extraire des données simples d'un objet JSON.

Vous devriez maintenant avoir le fichier data.txt dans votre répertoire /home/labex/project/. Il contient des données JSON représentant une liste d'attractions. Le contenu du fichier ressemble à ceci :

[
  {
    "name": "The Great Wall of China",
    "location": "Shanxi Province",
    "opening_hours": "24 hours"
  },
  {
    "name": "Terracotta Warriors",
    "location": "XiAn",
    "opening_hours": "9:00 AM -  5:00 PM"
  }
]

Notre objectif ici est d'extraire les noms de toutes les attractions répertoriées dans ces données JSON.

Pour ce faire, utilisez la commande suivante :

cat ~/project/data.txt | jq '.[] |.name'

Cette commande produira la sortie suivante :

"The Great Wall of China"
"Terracotta Warriors"

Analysons ce qui se passe dans cette commande. cat ~/project/data.txt lit simplement le contenu du fichier data.txt. Le symbole |, appelé tuyau (pipe en anglais), prend la sortie de la commande cat et l'utilise comme entrée pour la commande jq. Le cœur de la logique d'extraction se trouve dans jq '.[] |.name'. Voici comment jq traite cela :

  • .[] indique à jq d'itérer sur chaque élément (dans ce cas, chaque objet attraction) dans le tableau JSON.
  • | à nouveau, transmet le résultat de l'itération à l'opération suivante, dans ce cas .name.
  • .name extrait la valeur associée à la clé "name" de chacun des objets attraction.

En substance, la commande parcourt chaque attraction, sélectionne son nom et l'affiche.

Filtrer des données JSON

Passons maintenant au filtrage de données JSON en fonction de critères spécifiques.

Notre objectif est de trouver uniquement les attractions ouvertes 24 heures sur 24.

Utilisez la commande suivante pour y parvenir :

cat ~/project/data.txt | jq '.[] | select(.opening_hours == "24 hours") |.name'

L'exécution de cette commande produira la sortie suivante :

"The Great Wall of China"

Voici comment le filtrage fonctionne : La commande commence par cat ~/project/data.txt | jq '.[]', qui, comme précédemment, lit le fichier et itère sur chaque attraction. La partie clé est l'ajout de select(.opening_hours == "24 hours") :

  • select() est une fonction jq qui vous permet de filtrer les éléments du JSON en fonction d'une condition que vous spécifiez.
  • La condition .opening_hours == "24 hours" vérifie si la valeur du champ opening_hours est exactement égale à la chaîne de caractères "24 hours". Seules les attractions correspondant à cette condition seront transmises à l'étape suivante.
  • La dernière partie, |.name, extrait simplement le nom de chaque attraction qui a passé le filtre.

Dans ce cas, seule "The Great Wall of China" répond à la condition, donc c'est le seul nom qui est extrait et affiché.

Transformation de données JSON

Maintenant, explorons comment transformer des données JSON en un format différent et plus utile.

Notre objectif ici est de rendre les horaires d'ouverture plus lisibles. Plus précisément, si une attraction est ouverte 24 heures sur 24, nous voulons afficher "Open 24 hours" ; sinon, nous ajouterons le préfixe "Open " au texte des horaires d'ouverture existant.

Utilisez la commande suivante pour y parvenir :

cat ~/project/data.txt | jq '.[] | {name:.name, location:.location, opening_hours: (.opening_hours | if. == "24 hours" then "Open 24 hours" else "Open \(.)" end)}'

Cette commande produit la sortie suivante :

{
  "name": "The Great Wall of China",
  "location": "Shanxi Province",
  "opening_hours": "Open 24 hours"
}
{
  "name": "Terracotta Warriors",
  "location": "XiAn",
  "opening_hours": "Open 9:00 AM -  5:00 PM"
}

Comprenons la transformation : Comme précédemment, cat ~/project/data.txt | jq '.[]' nous permet de commencer en lisant le fichier et en itérant sur chaque attraction dans le tableau. Le cœur de cette transformation réside dans la construction de l'objet et dans l'instruction if-else :

  • {name:.name, location:.location, opening_hours:...} crée un nouvel objet JSON en extrayant les données de l'objet original. Il inclut directement le name et le location de l'objet original. Cependant, la valeur du champ opening_hours est plus complexe.
  • (.opening_hours | if. == "24 hours" then "Open 24 hours" else "Open \(.)" end) prend la valeur des horaires d'ouverture originaux et la traite :
    • .opening_hours sélectionne la valeur des horaires d'ouverture originaux.
    • L'instruction if. == "24 hours" then "Open 24 hours" else "Open \(.)" end vérifie si les horaires d'ouverture originaux sont exactement égaux à "24 hours". Si c'est le cas, la valeur est remplacée par "Open 24 hours". Sinon, "Open " est ajouté comme préfixe aux horaires d'ouverture existants. Notez l'utilisation de \(.), qui nous permet d'intégrer la valeur dans la chaîne de caractères.

En substance, cette commande transforme les données en créant un nouvel objet pour chaque attraction et en ajustant la valeur des opening_hours pour qu'elle soit plus lisible pour l'utilisateur.

Résumé

Félicitations! Vous avez réussi le laboratoire de programmation Linux jq. Vous avez appris à interroger, filtrer et transformer des données JSON en utilisant jq, un outil puissant pour travailler avec des données structurées directement depuis la ligne de commande. Que vous traitiez des données provenant d'API, de fichiers de configuration ou de toute autre source JSON, jq vous permet d'extraire, de filtrer et de manipuler les données dont vous avez besoin avec grande efficacité et clarté.

N'oubliez pas que la pratique régulière est essentielle pour maîtriser jq et d'autres outils de ligne de commande. N'hésitez pas à expérimenter avec vos propres données JSON, en essayant différentes requêtes et transformations. Bon codage!