如何使用命令行计算JSON对象中的项数?

381

我从一条curl命令中得到了这种类型的JSON响应:

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

我该如何使用 Bash 或命令行(例如 underscore)计算数组中的项目数量(这里是2)?


JavaScript方案对您来说可以吗? - thefourtheye
通过 NPM 模块可以,否则不行。 - Édouard Lopez
检查一下我的解决方案。这个不需要使用npm,纯粹的JavaScript。 - thefourtheye
3
我处于Bash环境下,而非Web。 - Édouard Lopez
7个回答

646

只是想在方案中再加入一个...

尝试使用jq,这是一个轻量且灵活的命令行JSON处理器:

jq length /tmp/test.json

打印对象数组的长度。


4
您最初的jq代码(.[])返回根数组中每个对象的长度,而我正在寻找根数组本身的长度。需要修正为. - Édouard Lopez
55
如果你的根元素不是一个数组,而是一个包含数组的键的对象,例如 { "key": [elem1, elem2] },那么你可以使用 jq '.[] | length' file.json。请注意,翻译保持原意,同时尽可能地通俗易懂。 - Alex Bitek
2
另一个对于 @MnemonicFlow 有用的选项是 jq map_values(length) file.json。这将给你键和值。 - Paulo Casaretto
17
如果您的输入由独立的对象而不是单个数组组成,则可以使用-s--slurp选项,在读取时将它们收集到一个数组中: jq -s length file.json. - hemflit
@bitek,要么我理解错了,要么你弄错了。echo '{"key":[1,"asdf"]}' | jq '.[] | length'会报错。对我来说产生期望结果的是echo '{"key":[1,"asdf"]}' | jq '.key | length' - x-yuri
显示剩余2条评论

91
你也可以使用jq来查找返回的json中的数组,然后将其输入到第二个jq调用中以获取其长度。假设它在名为records的属性中,像{"records":[...]}
$ curl https://my-source-of-json.com/list | jq -r '.records | length'
2
$ 

90

最短的表达式是

curl 'http://…' | jq length

19

如果需要从文件中读取 JSON,请尝试以下操作 -

number_of_objects=`jq '. | length' json_file_name.json`
echo $number_of_objects

如果 JSON 数组位于以下示例中 JSON 中的键内 -

{
  "fruits": [
    "apples",
    "oranges",
    "pears"
  ]
}

试一下这个 -

number_of_objects=`jq '.fruits | length' json_file_name.json`
echo $number_of_objects

(为了让这个解决方案起作用,您需要下载jq)。


7
假设有以下结构:
(存储在名为json的变量中)
{
    "results": [
        { "id": 1 }
        { "id": 2 }
    ]

}

如果您想统计 results 数组中有多少个元素,命令如下:

$json | jq '.results | length'

5

一种简单的解决方案是安装 jshon 库:

jshon -l < /tmp/test.json
2

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接