¿Cómo contar elementos en un objeto JSON usando la línea de comando?

179

Recibo este tipo de JSONrespuesta de 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": ""
  }
]

¿Cómo puedo contar el número de elementos en la matriz (aquí 2), usando Basho una línea de comando (por ejemplo underscore)?

Édouard Lopez
fuente
¿Es la solución de JavaScript, está bien para usted?
thefourtheye
A través del NPMmódulo sí. De otra manera no.
Édouard Lopez
Comprueba mi solución. Eso no necesita npm. JavaScript simple.
thefourtheye
1
Estoy en un contexto bash, no web
Édouard Lopez
Sabes que puedes ejecutar JavaScript en shell, ¿verdad?
thefourtheye

Respuestas:

358

Simplemente lanzando otra solución en la mezcla ...

Pruebe jq, un procesador JSON de línea de comandos ligero y flexible:

jq length /tmp/test.json

Imprime la longitud de la matriz de objetos.

Conocido
fuente
44
Su jqcódigo inicial ( .[]) devuelve la longitud de cada uno objecten la matriz raíz, mientras busco la longitud de la matriz raíz en sí. Necesito arreglarlo.
Édouard Lopez
11
Si su raíz no es una matriz sino un objeto con una clave que contiene una matriz, es decir, {"clave": [elem1, elem2]}, puede usar usejq '.[] | length' file.json
bitek el
8
Herramienta increíble, jqes. +1
Ory Band
Otra opción útil para ese @MnemonicFlow es jq map_values(length) file.json. Eso también te dará las llaves.
Paulo Casaretto
3
Y si su entrada está hecha de objetos independientes en lugar de una sola matriz, usaría la opción -so --slurp, que los recopila en una matriz mientras lee:jq -s length file.json
hemflit
42

La expresión más corta es

curl 'http://…' | jq length
nikolay
fuente
3

Una solución simple es instalar la jshonbiblioteca:

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