Come contare gli oggetti nell'oggetto JSON usando la riga di comando?


179

Ricevo questo tipo di JSONrisposta da un curlcomando:

[
  {
    "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": ""
  }
]

Come posso contare il numero di elementi nell'array (qui 2), usando Basho una riga di comando (ad es. underscore)?


La soluzione JavaScript è adatta a te?
thefourtheye

Attraverso il NPMmodulo sì. Altrimenti no.
Édouard Lopez,

Controlla la mia soluzione. Non ha bisogno di npm. JavaScript semplice.
thefourtheye

1
Sono in un contesto bash, non web
Édouard Lopez,

Sai che puoi eseguire JavaScript nella shell, giusto?
thefourtheye

Risposte:


359

Basta lanciare un'altra soluzione nel mix ...

Prova jqun processore JSON da riga di comando leggero e flessibile:

jq length /tmp/test.json

Stampa la lunghezza della matrice di oggetti.


4
Il tuo jqcodice iniziale ( .[]) restituisce la lunghezza di ciascuno objectnell'array root, mentre sto cercando la lunghezza dell'array root stesso. Devo risolvere.
Édouard Lopez il

11
Se la tua radice non è un array ma un oggetto con una chiave che contiene un array, ovvero {"chiave": [elem1, elem2]}, puoi usare usejq '.[] | length' file.json
bitek,

8
Lo strumento jqè incredibile . +1
Ory Band

Un'altra opzione utile per quel @MnemonicFlow è jq map_values(length) file.json . Questo ti darà anche le chiavi.
Paulo Casaretto,

3
E se il tuo input è composto da oggetti indipendenti anziché da un singolo array, dovresti utilizzare l' opzione -so --slurp, che li raccoglie in un array durante la lettura:jq -s length file.json
hemflit

42

L'espressione più breve è

curl 'http://…' | jq length

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.