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