Agence web » Actualités du digital » Comment travailler avec JSON sur la ligne de commande

Comment travailler avec JSON sur la ligne de commande

Linux n'a pas de méthode intégrée pour gérer correctement JSON, mais de nombreuses API renvoient une sortie JSON. Voici comment analyser et utiliser des données JSON dans vos scripts shell avec un simple utilitaire.

Analyser JSON avec jq

jq est un utilitaire qui peut gérer tout ce que vous voudrez peut-être faire avec JSON. C'est super simple à installer; téléchargez simplement le binaire et déplacez-le dans votre dossier sur votre CHEMIN, généralement /usr/local/bin/. Il n'a pas de dépendances, donc c'est juste un binaire à télécharger. Il existe également des téléchargements pour macOS et Windows.

Pour commencer, vous pouvez lui rediriger du JSON pour l'imprimer. Certaines API réduiront leurs réponses pour économiser de l'espace, ce qui entraînera ce terrible gâchis lorsque vous curl quelque chose dans la console:

Pipe à jq ainsi:

curl https://api.example.com/ | jq

Et il est désormais lisible, avec une coloration syntaxique pour démarrer:

Si vous donnez jq une commande, il l'utilisera pour sélectionner des données dans le JSON, un peu comme la façon dont sed fonctionne sur du texte. Nous utiliserons ce JSONPlaceholder comme exemple d'API pour essayer des commandes. Par souci de simplicité, nous laisserons de côté curl commande et pipe pour que tout reste lisible. Vous pouvez également recourber vers un fichier et un tuyau cat à jq, si vous ne voulez pas voir curl sortie chaque fois que vous testez une nouvelle commande.

Une simple période «.«Représente les données jq. Si vous voulez simplement obtenir une clé de l'objet, vous pouvez faire:

jq '.status'

Vous pouvez également l'imbriquer; par exemple, '.data.geo.host' retournerait une valeur plus bas dans la liste. En option, vous pouvez ajouter un point d'interrogation pour la vérification des erreurs comme ".data.geo?.host», Qui spécifie que la propriété est facultative.

Travailler avec des tableaux est l'endroit où jq devient intéressant. Vous pouvez utiliser des crochets pour obtenir un élément de tableau spécifique. Par exemple, vous pouvez obtenir le nom de la première entrée avec:

jq '.(0).name'

Vous pouvez découper des tableaux en utilisant (2:5)et utilisez la même syntaxe de point d'interrogation pour les propriétés facultatives. Gardez à l'esprit que si un tableau est vide, cela ne signifie pas qu'il s'agit d'une propriété non valide.

Cependant, vous souhaiterez probablement récupérer une entrée spécifique en fonction des données qu'elle contient, et non de l'ordre du tableau. Pour ce faire, passez tout le tableau au select utilitaire:

jq '.() | select(.name | contains("Leanne"))'

Cela filtre le tableau pour inclure uniquement les éléments qui réussissent le test; dans ce cas, le name champ contient un certain nom? Cela peut être n'importe quelle expression booléenne, même arithmétique comme select(.count >= 2).

Reformater JSON

jq peut également construire JSON, ce qui signifie que vous pouvez l'utiliser pour reformater l'entrée JSON. Vous pouvez créer des objets simplement en les mettant entre crochets et passer jq instructions comme valeurs. jq affichera le nouvel objet. Par exemple:

cat json | jq '.(0) | {name: .name, company: .company}'

Affiche bien sur la ligne de commande:

Bien que cela soit utile pour supprimer uniquement les informations souhaitées, vous pouvez également créer de nouveaux objets à l'aide de jq commandes.

Pour une référence complète sur tous jqLa syntaxe, vous pouvez consulter son manuel en ligne.

Alternatives à jq

Si vous ne souhaitez pas utiliser un autre programme, vous pouvez utiliser quelques alternatives. La méthode la plus simple consiste à renoncer à le faire en bash et à utiliser un langage de script comme Python ou JavaScript (avec nœud) pour effectuer le traitement proprement dit. Vous préférez plutôt diriger la sortie de la commande JSON vers un fichier:

curl https://api/example.com/ > json.txt

Et puis chargez-le dans une variable du script pour l'utiliser.

Vous pouvez également utiliser de simples utilitaires de sélection de texte; par exemple, si vous avez juste besoin d'une clé spécifique dans une réponse, vous pouvez utiliser grep à côté d'une expression régulière pour sélectionner la valeur:

grep "name" | sed 's/"name": "(.*)"/1/'

Cependant, cela peut (et sera probablement) rompre très facilement avec toute modification du JSON. La transmission de l'API des utilisateurs a renvoyé le nom de chaque utilisateur, mais aussi le nom d'utilisateur (qui correspondait également à grep), ainsi que le nom de l'entreprise (qui avait exactement la même clé). Sauf si vous prévoyez de tenir compte de tout cela, vous devez utiliser quelque chose qui connaît la structure du JSON, plutôt que de le traiter comme du texte.

★★★★★