如何使用jq筛选缺少的内键

时间:2019-05-21 04:37:23

标签: json filter jq

得到了这样的json输入:

[ 
{
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322460000,
      "value": "0.0"
    }
  },
  {
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322160000,
      "value": "0.0"
    }
  },
  {
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": "3423.25"
  }
]

第三个对象上没有时间戳。我怎么能返回所有只带有时间戳的对象。如下所示:

[ 
{
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322460000,
      "value": "0.0"
    }
  },
  {
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322160000,
      "value": "0.0"
    }
  }
]

非常感谢。

干杯, 文森特

3 个答案:

答案 0 :(得分:3)

map( select ( .values | has("timestamp")? ))

答案 1 :(得分:2)

这是一个替代解决方案,使用针对JSON的步行路径unix工具: jtc

bash $ <file.json jtc -w'<timestamp>l:[-2]' -j
[
   {
      "dimensions": "helloworld",
      "metrics": "sum(is_error)",
      "values": {
         "timestamp": 1558322460000,
         "value": "0.0"
      }
   },
   {
      "dimensions": "helloworld",
      "metrics": "sum(is_error)",
      "values": {
         "timestamp": 1558322160000,
         "value": "0.0"
      }
   }
]
bash $ 
  • 它找到每个(所有)标签timestamp,然后从找到的json条目上移2个级别并打印找到的Json元素。 -j将所有打印的走行包装回阵列。

PS>披露:我是jtc工具的创建者

答案 2 :(得分:1)

工作示例: [ .[] | select (.values | has("timestamp")?) ]

https://jqplay.org/s/n5jsRsPMhW

或替代方法: [ .[] | select (.values.timestamp?) ]

https://jqplay.org/s/HRWV44YgUp

P.S。 This one是不正确的,因为在。[]之后,您分别处理每个项目,而不是数组。因此不需要“地图”功能。