Comment compter les éléments dans un objet JSON en utilisant la ligne de commande?

192

J'obtiens ce genre de JSONréponse d'une curlcommande:

[
  {
    "cid": 49,
    "pyn": "yi4",
    "hans": "亿",
    "hant": "億",
    "tid": 68,
    "l10n": "cent million",
    "pid": 1,
    "pos": "num",
    "pos_txt": ""
  },
  {
    "cid": 50,
    "pyn": "yi4",
    "hans": "亿",
    "hant": "億",
    "tid": 69,
    "l10n": "100 millions",
    "pid": 1,
    "pos": "num",
    "pos_txt": ""
  }
]

Comment puis-je compter le nombre d'éléments dans le tableau (ici 2), en utilisant Bashou une ligne de commande (par exemple underscore)?

Édouard Lopez
la source
La solution JavaScript vous convient-elle?
thefourtheye
Par NPMmodule oui. Sinon, non.
Édouard Lopez
Vérifiez ma solution. Cela n'a pas besoin de npm. JavaScript simple.
thefourtheye
1
Je suis dans un contexte bash, pas sur le web
Édouard Lopez
Vous savez que vous pouvez exécuter JavaScript dans le shell, non?
thefourtheye

Réponses:

376

Juste jeter une autre solution dans le mélange ...

Essayez jq, un processeur JSON en ligne de commande léger et flexible:

jq length /tmp/test.json

Imprime la longueur du tableau d'objets.

Ken
la source
4
Votre jqcode initial ( .[]) renvoie la longueur de chacun objectdans le tableau racine, pendant que je recherche la longueur du tableau racine lui-même. Besoin de corriger.
Édouard Lopez
13
Si votre racine n'est pas un tableau mais un objet avec une clé qui contient un tableau, ie {"key": [elem1, elem2]}, alors vous pouvez utiliser usejq '.[] | length' file.json
Alex Bitek
8
Un outil incroyable, jqest. +1
Ory Band
Une autre option utile pour cela @MnemonicFlow est jq map_values(length) file.json. Cela vous donnera également les clés.
Paulo Casaretto
4
Et si votre entrée est faite d'objets indépendants au lieu d'un seul tableau, vous utiliseriez l' option -sou --slurp, qui les rassemble dans un tableau lors de la lecture:jq -s length file.json
hemflit
46

L'expression la plus courte est

curl 'http://…' | jq length
Nikolay
la source
3

Une solution simple consiste à installer la jshonbibliothèque:

jshon -l < /tmp/test.json
2
Édouard Lopez
la source
0

Vous pouvez également utiliser jq pour suivre le tableau dans le json renvoyé, puis le diriger vers un deuxième jq appel pour obtenir sa longueur. Supposons que ce soit dans une propriété appelée records, comme {"records":[...]}.

$ curl https://my-source-of-json.com/list | jq -r '.records' | jq length
2
$ 
Yuvilio
la source