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)?


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.


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


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
$ 
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.