72 votes

Quels sont les bons outils CLI pour JSON?

Problème Général

Si je vais peut-être le diagnostic de la cause d'un événement, de déterminer le nombre d'utilisateurs touchés, ou de la distillation de la synchronisation des journaux afin d'évaluer les performances et le débit de l'impact d'une récente modification du code, mes outils restent les mêmes: grep, awk, sed, tr, uniq, sort, zcat, tail, head, join, et split. Pour la colle tous ensemble, Unix nous donne des tuyaux, et pour les amateur de filtrage, nous avons xargs. Si ces derniers ne parviennent pas moi, il y a toujours perl -e.

Ces outils sont parfaits pour le traitement des fichiers CSV, fichiers délimités par des tabulations, les fichiers journaux prévisible format de la ligne, ou des fichiers avec séparées par des virgules paires clé-valeur. En d'autres termes, les fichiers où chaque ligne a un côté pas de contexte.

XML Analogues

J'ai récemment eu besoin de chalut par Gigaoctets de XML pour construire l'histogramme de l'utilisation par l'utilisateur. C'était assez facile avec les outils que j'avais, mais pour les questions plus complexes de la normale approches briser. Dire que j'ai des fichiers avec des articles comme ceci:

<foo user="me">
    <baz key="zoidberg" value="squid" />
    <baz key="leela"    value="cyclops" />
    <baz key="fry"      value="rube" />
</foo>

Et disons que je veux produire une cartographie de l'utilisateur nombre moyen d' <baz>s par <foo>. Traitement ligne par ligne n'est plus une option: j'ai besoin de savoir qui de l'utilisateur <foo> , je suis en train d'inspecter donc je sais dont la durée moyenne de mise à jour. Toute sorte de Unix un liner qui accomplit cette tâche est susceptible d'être impénétrable.

Heureusement, dans XML-terre, nous avons de merveilleux technologies comme XPath, XQuery et XSLT pour nous aider.

Auparavant, j'avais pris l'habitude d'utiliser le merveilleux XML::XPath module Perl pour accomplir des requêtes comme celle-ci, mais après la découverte d'une TextMate Plugin qui pourrait exécuter une expression XPath contre ma fenêtre, j'ai arrêté d'écrire un arrêt de scripts Perl pour la requête XML. Et je viens de découvrir sur XMLStarlet qui est de l'installation que je tape, et j'ai hâte d'utiliser à l'avenir.

JSON Solutions?

Donc ce qui m'amène à ma question: existe-il des outils de ce genre pour JSON? C'est seulement une question de temps avant que certains tâche de l'enquête m'oblige à effectuer des requêtes sur des fichiers JSON, et sans outils comme XPath et XSLT, une telle tâche sera beaucoup plus difficile. Si j'avais un tas de JSON qui ressemblait à ceci:

{
  "firstName": "Bender",
  "lastName": "Robot",
  "age": 200,
  "address": {
    "streetAddress": "123",
    "city": "New York",
    "state": "NY",
    "postalCode": "1729"
  },
  "phoneNumber": [
    { "type": "home", "number": "666 555-1234" },
    { "type": "fax", "number": "666 555-4567" }
  ]
}

Et je voulais trouver le nombre moyen de numéros de téléphone de chaque personne avait, je pourrais faire quelque chose comme ça avec XPath:

fn:avg(/fn:count(phoneNumber))

Questions

  1. Existe-il des outils de ligne de commande qui peut "requête" des fichiers JSON dans ce de la sorte?
  2. Si vous avez à traiter un tas de Des fichiers JSON sur une ligne de commande Unix, quels outils utilisez-vous?
  3. Diable, est-il même travail effectué pour faire un langage de requête comme ceci pour JSON?
  4. Si vous utilisez des outils de ce genre dans votre journée-à-jour de travail, que faites-vous aime/aime pas parler d'eux? Sont là tout pièges?

Je m'aperçois de plus en plus et de sérialisation des données est effectué à l'aide de JSON, de sorte que les outils de traitement, comme ce sera crucial lors de l'analyse de données de grande taille des images dans l'avenir. Les bibliothèques de langue pour JSON sont très fortes et il est assez facile d'écrire des scripts pour faire ce genre de traitement, mais pour vraiment laisser les gens jouer avec les données shell outils sont nécessaires.

Questions Connexes

59voto

Brian Tingle Points 386

Je viens de trouver ceci:

http://stedolan.github.com/jq/

"jq est léger et flexible de ligne de commande JSON processeur."

2014 mise à jour:

@user456584 mentionné:

Il y a aussi le 'json' de la commande (par exemple 'jsontool'). J'ai tendance à le préférer plus de jq. Très UNIX-y. Voici un lien vers le projet: github.com/trentm/json –

dans l' json README à http://github.com/trentm/json il y a une longue liste de choses semblables

7voto

Dave Dopson Points 16690

J'ai créé un module spécialement conçu pour la ligne de commande JSON manipulation:

https://github.com/ddopson/underscore-cli

  • FLEXIBLE - LE "swiss army knife" outil pour le traitement des données JSON - peut être utilisé comme un simple imprimeur, ou plein alimenté Javascript de ligne de commande
  • PUISSANT - Expose toute la puissance et la fonctionnalité de underscore.js (plus le trait de soulignement.chaîne de caractères)
  • SIMPLE - il est simple à écrire JS one-liners similaire à l'aide de "perl -pe"
  • ENCHAÎNÉS - commande Plusieurs invokations peuvent être liés ensemble pour créer un pipeline de traitement de données
  • MULTI-FORMAT Riche de soutien pour l'entrée / la sortie des formats d'impression, strict, JSON, etc [bientôt]
  • DOCUMENTÉ - Excellente ligne de commande de la documentation avec de multiples exemples pour chaque commande

Il vous permet de faire des choses puissantes vraiment facilement:

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

Il a une très belle ligne de commande du système d'aide et est extrêmement flexible. Il est bien testé et prêt à l'emploi; cependant, je suis encore la construction de quelques-uns des fonctionnalités telles que des solutions de rechange pour le format d'entrée/sortie, et la fusion dans mon template de la manipulation de l'outil (voir TODO.md). Si vous avez des demandes de fonctionnalités, un commentaire sur ce post ou en ajouter une question sur github. J'ai conçu un assez vaste, de fonctionnalités, mais je serais heureux de hiérarchiser les fonctions qui sont nécessaires par les membres de la communauté.

5voto

azatoth Points 1783

Une façon de le faire est de le convertir en XML. La suite utilise deux modules Perl (JSON et XML :: Simple) pour effectuer une conversion à la volée:

 cat test.json | perl -MJSON -MXML::Simple -e 'print XMLout(decode_json(do{local$/;<>}),RootName=>"json")'
 

qui pour votre exemple json se termine par:

 <json age="200" firstName="Bender" lastName="Robot">
  <address city="New York" postalCode="1729" state="NY" streetAddress="123" />
  <phoneNumber number="666 555-1234" type="home" />
  <phoneNumber number="666 555-4567" type="fax" />
</json>
 

4voto

chmeee Points 288

Jetez un oeil à ce projet fou jsawk . Il est conçu pour filtrer via une entrée JSON à partir de la ligne de commande. Recherchez également un client REST en ligne de commande que vous pouvez utiliser dans les pipelines pouvant s'avérer utiles.

3voto

newtover Points 12301

Récemment, j'ai découvert que JSON peut facilement être utilisé avec Python à eval :

 $ python -c "json=eval(open('/json.txt').read()); print len(json['phoneNumber'])"
2
 

Bien que la méthode échoue évidemment si l'entrée JSON contient des valeurs NULL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X