Como contar itens no objeto JSON usando a linha de comando?

179

Estou recebendo esse tipo de JSONresposta de um 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": ""
  }
]

Como posso contar o número de itens na matriz (aqui 2), usando Bashou uma linha de comando (por exemplo underscore)?

Édouard Lopez
fonte
A solução JavaScript é adequada para você?
precisa saber é o seguinte
Através do NPMmódulo sim. Caso contrário, não.
Édouard Lopez
Verifique minha solução. Isso não precisa de npm. JavaScript simples.
precisa saber é o seguinte
1
Estou num contexto bash, não web
Édouard Lopez
Você sabe que pode executar JavaScript no shell, certo?
thefourtheye

Respostas:

358

Apenas jogando outra solução na mistura ...

Experimente jq, um processador JSON de linha de comando leve e flexível:

jq length /tmp/test.json

Imprime o comprimento da matriz de objetos.

Ken
fonte
4
Seu jqcódigo inicial ( .[]) retorna o comprimento de cada um objectna matriz raiz, enquanto eu estou procurando o comprimento da matriz raiz. Precisa corrigir para.
Édouard Lopez
11
Se sua raiz não é uma matriz, mas um objeto com uma chave que contém uma matriz, ou seja, {"key": [elem1, elem2]}, então você pode usar o usojq '.[] | length' file.json
bitek
8
Ferramenta incrível, jqé. +1
Ory Band
Outra opção útil para esse @MnemonicFlow é jq map_values(length) file.json. Isso lhe dará as chaves também.
Paulo Casaretto
3
E se a sua entrada é feita de objetos independentes em vez de uma única matriz, você pode usar o -sou --slurpopção, que os recolhe em uma matriz enquanto lia:jq -s length file.json
hemflit
42

A expressão mais curta é

curl 'http://…' | jq length
Nikolay
fonte
3

Uma solução simples é instalar a jshonbiblioteca:

jshon -l < /tmp/test.json
2
Édouard Lopez
fonte