Comment travailler avec JSON sur la ligne de commande

Contenu

Données JSON

Linux n'a pas de moyen intégré pour gérer correctement JSON, malgré cela, de nombreuses API renverront une sortie JSON. Ensuite, explique comment analyser et utiliser les données JSON dans vos scripts shell avec un utilitaire simple.

Analyser JSON avec jq

jq c'est un utilitaire qui peut gérer tout ce que vous voulez faire avec JSON. Il est très facile à installer; téléchargez simplement le binaire et déplacez-le dans votre dossier dans votre PATH, 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 y diriger JSON pour l'imprimer joliment. Certaines API minimiseront vos réponses pour économiser de l'espace, qu'est-ce qui causera ce terrible gâchis quand curl quelque chose sur la console:

curl sur la console

Tapez-le pour jq de la même manière que:

boucle https://api.exemple.com/ | jq

Et maintenant c'est lisible, avec coloration syntaxique pour démarrer:

Texte lisible par l'homme avec coloration syntaxique

Si vous donnez jq une commande, vous l'utiliserez pour choisir des données en dehors du JSON, tout comme comment sed fonctionner avec du texte. Nous utiliserons ceci JSONPlaceholder comme exemple d'API pour tester les commandes. Pour des raisons de simplicité, nous laisserons de côté le curl commande et pipe pour que tout reste lisible. De plus, vous pouvez boucler un fichier et un tuyau cat afin de jq, si vous ne faites pas semblant de voir le curl sortie chaque fois que vous essayez une nouvelle commande.

Une période simple ‘.« Représente les données acheminées vers jq. Si vous voulez juste obtenir une clé de l'objet, peut faire:

jq '.status'

Vous pouvez également imbriquer ce; par exemple, '.data.geo.host' renverrait une valeur plus bas dans la liste. En option, vous pouvez ajouter un point d'interrogation pour vérifier les erreurs comme “.data.geo?.host", Qui précise que la propriété est facultative.

Travailler avec des matrices est l'endroit où jq ça 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].Nom'

Vous pouvez couper des matrices en utilisant [2:5]et utilisez la même syntaxe de point d'interrogation pour les propriétés facultatives. Même si notez que si un tableau est vide, ne signifie pas que c'est une propriété invalide.

Malgré cela, vous voulez probablement obtenir une entrée spécifique basée sur les données qu'elle contient, pas dans l'ordre matriciel. Pour faire ça, passer toute la matrice au select utilitaire:

jq'.[] | sélectionner(.Nom | contient("Léanne"))'

Cela filtre le tableau pour n'inclure que les éléments qui réussissent le test; dans cette circonstance, les name le champ contient un nom spécifique? Peut être n'importe quelle expression booléenne, y compris l'arithmétique comme select(.count >= 2).

Reformatage JSON

jq vous pouvez également construire JSON, ce qui signifie que vous pouvez l'utiliser pour reformater l'entrée JSON. Vous pouvez créer des objets en les enveloppant simplement dans des accolades et en passant jq des déclarations comme des valeurs. jq générera le nouvel objet. Par exemple:

chat json | jq'.[0] | {Nom: .Nom, entreprise: .entreprise}'

Sortie très bien sur la ligne de commande:

jq génère le nouvel objet

Bien que cela soit utile pour supprimer uniquement les informations que vous souhaitez, vous pouvez également construire de nouveaux objets en utilisant jq commandes.

Pour une référence complète de tous jqsyntaxe, tu peux consultez votre manuel en ligne.

Alternatives a jq

Si vous ne voulez pas utiliser un autre programme, vous pouvez utiliser des alternatives. La méthode la plus simple est de renoncer à le faire en bash et, à sa place, utiliser un langage de script comme Python ou JavaScript (avec nœud) pour effectuer le traitement proprement dit. À sa place, Je dirigerais la sortie de la commande JSON vers un fichier:

boucle https://api/exemple.com/ > json.txt

Et puis chargez-le dans une variable à l'intérieur du script pour votre usage.

Vous pouvez également utiliser des utilitaires de sélection de texte simples; par exemple, si vous n'avez besoin que d'une clé spécifique d'une réponse, vous pouvez utiliser grep avec une regex pour choisir la valeur:

grep "Nom" | mais c'est/"Nom": "(.*)"/1/'

Malgré cela, Ceci peut (et cela arrivera probablement) très facilement avec tout changement dans le JSON. Passer l'API des utilisateurs, le nom de chaque utilisateur a été renvoyé, mais aussi le nom d'utilisateur (qui correspondait aussi à grep), ainsi que le nom de l'entreprise (qui avait exactement la même clé). A moins que vous ne prévoyiez de faire attention à tout cela, vous devez utiliser quelque chose qui connaît la structure JSON, au lieu de le traiter comme du texte.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.