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:
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:
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:
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 jq
syntaxe, 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.