Bagaimana cara menghitung item dalam objek JSON menggunakan baris perintah?


179

Saya mendapatkan JSONbalasan semacam ini dari sebuah curlperintah:

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

Bagaimana saya bisa menghitung jumlah item dalam array (di sini 2), menggunakan Bashatau baris perintah (misalnya underscore)?


Apakah solusi JavaScript, oke untuk Anda?
theouroureye

Melalui NPMmodul ya. Kalau tidak, tidak.
Édouard Lopez

Periksa solusi saya. Tidak perlu npm. JavaScript polos.
theouroureye

1
Saya dalam konteks bash, bukan web
Édouard Lopez

Anda tahu bahwa Anda dapat menjalankan JavaScript di shell, kan?
theouroureye

Jawaban:


358

Hanya melempar solusi lain dalam campuran ...

Coba jq, prosesor JSON baris perintah yang ringan dan fleksibel:

jq length /tmp/test.json

Mencetak panjang array objek.


4
jqKode awal Anda ( .[]) mengembalikan panjang masing-masing objectdalam array root, sementara saya sedang mencari panjang array root itu sendiri. Perlu diperbaiki ke.
Édouard Lopez

11
Jika root Anda bukan array tetapi objek dengan kunci yang berisi array, yaitu {"key": [elem1, elem2]}, maka Anda dapat menggunakan usejq '.[] | length' file.json
bitek

8
Alat luar biasa, jqadalah. +1
Ory Band

Opsi lain yang bermanfaat untuk @MnemonicFlow adalah jq map_values(length) file.json. Itu akan memberi Anda kunci juga.
Paulo Casaretto

3
Dan jika input Anda terbuat dari objek independen dan bukan array tunggal, Anda akan menggunakan opsi -satau --slurp, yang mengumpulkan mereka ke dalam array saat membaca:jq -s length file.json
hemflit

42

Ekspresi terpendek adalah

curl 'http://…' | jq length

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.