Как считать элементы в объекте JSON с помощью командной строки?

179

Я получаю такой JSONответ от curlкоманды:

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

Как подсчитать количество элементов в массиве (здесь 2), используя Bashили командную строку (например underscore)?

Эдуард Лопес
источник
Является ли решение JavaScript, хорошо для вас?
thefourtheye
Через NPMмодуль да. В противном случае нет.
Эдуард Лопес
Проверьте мое решение. Это не нужно нпм. Простой JavaScript.
thefourtheye
1
Я в контексте Bash, а не в Интернете
Эдуард Лопес
Вы знаете, что можете выполнять JavaScript в оболочке, верно?
thefourtheye

Ответы:

359

Просто бросаю другое решение в смеси ...

Попробуйте jq, легкий и гибкий процессор JSON командной строки:

jq length /tmp/test.json

Печатает длину массива объектов.

кругозор
источник
4
Ваш исходный jqкод ( .[]) возвращает длину каждого objectв корневом массиве, в то время как я ищу длину самого корневого массива. Нужно исправить.
Эдуард Лопес
11
Если ваш корень не массив, а объект с ключом, который содержит массив, т.е. {"ключ": [elem1, elem2]}, тогда вы можете использовать usejq '.[] | length' file.json
bitek
8
Удивительный инструмент, jqесть. +1
Ory Band
Еще одна полезная опция для этого @MnemonicFlow jq map_values(length) file.json. Это также даст вам ключи.
Пауло Касаретто
3
И если ваш ввод сделан из независимых объектов, а не из одного массива, вы бы использовали опцию -sили --slurp, которая собирает их в массив при чтении:jq -s length file.json
hemflit
42

Самое короткое выражение

curl 'http://…' | jq length
николай
источник
3

Простое решение - установить jshonбиблиотеку:

jshon -l < /tmp/test.json
2
Эдуард Лопес
источник