Afficher la sortie curl au format JSON lisible dans le script shell Unix


215

Dans mon script shell Unix, lorsque j'exécute une commande curl, le résultat sera affiché comme ci-dessous que je redirige vers le fichier:

{"type":"Show","id":"123","title":"name","description":"Funny","channelTitle":"ifood.tv","lastUpdateTimestamp":"2014-04-20T20:34:59","numOfVideos":"15"}

Mais, je veux que cette sortie mette au format JSON lisible comme ci-dessous dans le fichier:

{"type":"Show",
"id":"123",
"title":"name",
"description":"Funny",
"channelTitle":"ifood.tv",
"lastUpdateTimestamp":"2014-04-20T20:34:59",
"numOfVideos":"15"}

Comment formater la sortie de cette façon?

Réponses:


537

Essayez de faire ceci:

curl ... | json_pp 

ou avec en utilisant le filtre d'identité:

curl ... | jq '.'

entrez la description de l'image ici

ou avec et :

curl ... | node <<< "var o = $(cat); console.log(JSON.stringify(o, null, 4));"

Vérifiez https://stedolan.github.io/jq/


pouvez-vous être un peu détaillé ici s'il vous plaît
Jams

1
json_ppsemble formater les données dans l'ordre inverse de celui attendu. Existe-t-il un moyen d'annuler les données?
Antonio

1
json_pp est un utilitaire de commande Perl qui convertit entre certains formats d'entrée et de sortie (l'un d'eux JSON). Le format d'entrée par défaut est json et le format de sortie par défaut est json avec une jolie option.
Fabijan Bajo

3
la solution pipe to json_pp est si élégante. merci
andy

1
Le tuyau dans le nœud est très élégant. Merci!
Matthew Zackschewski

53

Je suppose que vous voulez embellir la sortie JSON. Cela pourrait être réalisé en utilisant python:

curl http://localhost:8880/test.json | python -mjson.tool > out.json

Merci de répondre. Mais je n'utilise pas Python, j'utilise shell. pouvez-vous me guider sur le shell
Jams

@Jams qui exécute python à partir du shell, ce qui donne une jolie sortie imprimée.
agconti

Excellente solution car python est préinstallé.
Gayan Weerakutti

1
Ce script python donne une erreur "pipe cassée" lorsque j'y ajoute un "| head".
Crouching Kitten

@CrouchingKitten Je ne vois pas ce problème moi-même (peut-être des versions différentes), mais cela peut être dû à la headcommande coupant la sortie qui lui est acheminée avant d'atteindre la fin, "cassant" ainsi le tuyau. Si vous autorisez headà consommer l'intégralité du flux de données du canal, je m'attends à ce que l'erreur ne s'affiche pas.
code_dredd

19
python -m json.tool
Curl http://127.0.0.1:5000/people/api.json | python -m json.tool

peut également aider.


12

Ceci est à ajouter à la réponse de Gilles. Il existe de nombreuses façons de le faire, mais personnellement, je préfère quelque chose de léger, facile à retenir et universellement disponible (par exemple, livré avec des installations LTS standard de votre saveur Linux préférée ou faciles à installer) sur les systèmes communs * nix.

Voici les options dans leur ordre préféré:

Module Python Json.tool

echo '{"foo": "lorem", "bar": "ipsum"}' | python -mjson.tool

avantages: presque disponibles partout; inconvénients: pas de code couleur


jq (peut nécessiter une installation unique)

echo '{"foo": "lorem", "bar": "ipsum"}' | jq

inconvénients: doit installer jq; avantages: codage couleur et polyvalent


json_pp (disponible dans Ubuntu 16.04 LTS)

echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp

Pour les utilisateurs Ruby

gem install jsonpretty
echo '{"foo": "lorem", "bar": "ipsum"}' | jsonpretty

Merci @zhenhua! J'ai utilisé cat myFile.json | python -mjson.tool >> myFilePretty.jsonpuis ouvert dans mon éditeur (vim, ne déteste pas) et j'ai obtenu des couleurs.
essa

11

Vous pouvez utiliser ce module de nœud

[sudo] npm i -g json; // suggère de ne pas utiliser le privilège root pour installer le module de noeud

puis ajoutez simplement |jsonaprès la boucle. curl http://localhost:8880/test.json |json


8

J'ai trouvé que json_reformat était très pratique. Je viens donc de faire ce qui suit:

curl http://127.0.0.1:5000/people/api.json | json_reformat

c'est tout!


Si vous utilisez Ubuntu, vous pouvez trouver json_reformat dans le package yajl-tools.
Kevin


1

Motivation: vous souhaitez imprimer la réponse JSON de prettify après la demande de commande curl.

Solution : json_pp - outil de ligne de commande qui convertit entre certains formats d'entrée et de sortie (l'un d'eux est JSON). Ce programme a été copié de json_xs et modifié. Le format d'entrée par défaut est json et le format de sortie par défaut est json avec une jolie option.

Synposis : json_pp [-v] [-f from_format] [-t to_format] [-json_opt options_to_json1[,options_to_json2[,...]]]

Formule :<someCommand> | json_pp

Exemple :

Demande

curl -X https://jsonplaceholder.typicode.com/todos/1 | json_pp 

Réponse

{
   "completed" : false,
   "id" : 1,
   "title" : "delectus aut autem",
   "userId" : 1
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.