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


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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.