Làm thế nào để đếm các mục trong đối tượng JSON bằng dòng lệnh?


179

Tôi nhận được loại JSONtrả lời này từ một curllệnh:

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

Làm thế nào tôi có thể đếm số lượng các mục trong mảng (ở đây 2), bằng cách sử dụng Bashhoặc một dòng lệnh (ví dụ underscore)?


Là giải pháp JavaScript, ổn cho bạn?
thefourtheye

Thông qua NPMmô-đun có. Mặt khác, không.
Édouard Lopez

Kiểm tra giải pháp của tôi. Điều đó không cần npm. JavaScript đơn giản.
thefourtheye

1
Tôi đang ở trong một bối cảnh bash, không phải web
Édouard Lopez

Bạn biết rằng bạn có thể thực thi JavaScript trong shell, phải không?
thefourtheye

Câu trả lời:


358

Chỉ cần ném một giải pháp khác trong hỗn hợp ...

Hãy thử jq, một bộ xử lý JSON dòng lệnh nhẹ và linh hoạt:

jq length /tmp/test.json

In chiều dài của mảng đối tượng.


4
jqMã ban đầu của bạn ( .[]) trả về độ dài của từng objectmảng trong mảng gốc, trong khi tôi đang tìm kiếm độ dài của mảng gốc. Cần sửa thành.
Édouard Lopez

11
Nếu gốc của bạn không phải là một mảng mà là một đối tượng có khóa chứa một mảng, tức là {"key": [elem1, elem2]}, thì bạn có thể sử dụngjq '.[] | length' file.json
cắn

8
Công cụ tuyệt vời, jqlà. +1
Ban nhạc Ory

Một tùy chọn hữu ích khác cho @MnemonicFlow đó là jq map_values(length) file.json. Điều đó sẽ cung cấp cho bạn các phím là tốt.
Paulo Casaretto

3
Và nếu đầu vào của bạn được tạo từ các đối tượng độc lập thay vì một mảng duy nhất, bạn sẽ sử dụng tùy chọn -shoặc --slurptùy chọn, thu thập chúng thành một mảng trong khi đọc:jq -s length file.json
hemflit

42

Biểu thức ngắn nhất là

curl 'http://…' | jq length

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.