使用jq计算缺少键的记录

the*_*ide 4 bash json count missing-data jq

以下是调用API时返回的示例输出:

curl "https://mywebsite.com/api/cars.json&page=1" |  jq '.' 
Run Code Online (Sandbox Code Playgroud)

使用jq,将如何计算数字或记录charge缺少密钥的位置?我知道代码的第一位将包括在内,jq '. | length'但是如何过滤掉包含或不包含某个键值的对象?

如果应用于以下示例,则输出为 1

{
  "current_page": 1,
  "items": [
    {
      "id": 1,
      "name": "vehicleA",
      "state": "available",
      "charge": 100
    },
    {
      "id": 2,
      "name": "vehicleB",
      "state": "available",
    },
    {
      "id": 3,
      "name": "vehicleB",
      "state": "available",
      "charge": 50
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

jq1*_*727 8

这是使用map和的解决方案length

.items | map(select(.charge == null)) | length
Run Code Online (Sandbox Code Playgroud)

在jqplay.org上在线尝试

这是使用的更有效的解决方案reduce

reduce (.items[] | select(.charge == null)) as $i (0;.+=1)
Run Code Online (Sandbox Code Playgroud)

在jqplay.org上在线尝试

样本运行(假设中包含已更正的JSON数据data.json

$ jq -M 'reduce (.items[] | select(.charge == null)) as $i (0;.+=1)' data.json
1
Run Code Online (Sandbox Code Playgroud)

请注意,上述各项均采用次要的快捷方式,前提是这些项目没有"charge":null成员。如果某些物品可以null收费,则测试== null不会区分那些物品和没有charge钥匙的物品。如果这是一个令人担忧的问题,has则最好使用以下形式的上述过滤器:

.items | map(select(has("charge")|not)) | length

reduce (.items[] | select(has("charge")|not)) as $i (0;.+=1)
Run Code Online (Sandbox Code Playgroud)