我有这个简单的Python脚本,它应该是更大的东西的一部分我只是无法弄清楚如何使用jmespath
#!/usr/bin/env python
import jmespath
if __name__ == '__main__':
# input json
text = \
{
'topology': [
{
'node': [
{
'topology-stats:session-state': {
'synchronized': True,
'local-pref': {
'session-id': 0,
'deadtimer': 120,
'ip-address': '10.30.170.187',
'keepalive': 30
},
'messages': {
'stateful-stats:sent-upd-msg-count': 1,
'last-sent-msg-timestamp': 1513334157,
'stateful-stats:last-received-rpt-msg-timestamp': 1513334157,
'unknown-msg-received': 0,
'stateful-stats:received-rpt-msg-count': 3,
'reply-time': {
'max-time': 77,
'average-time': 77,
'min-time': 77
},
'stateful-stats:sent-init-msg-count': 0,
'sent-msg-count': 1,
'received-msg-count': 3
},
'session-duration': '0:00:00:12'
},
'node-id': '10.30.170.117'
}
],
'topology-id': 'asdf-topology'
}
]
}
exp = jmespath.compile('''topology[*].node[?'topology-stats:session-state' != 'session-duration'][]''')
result = exp.search(text)
print result
我想要的是基本上删除具有不可预测值的键的行(在完美世界中我会切换通用的值) - 例如:last-sent-msg-timestamp,session-duration,stateful-stats:last -received-RPT-MSG-时间戳。完全我想保留其他所有内容,尽管我可以使用松散的拓扑和节点标记。
问题是我可以使用只有一个jmespath.search ,我只能做一个jmespath表达式。此外,我不能使用Python中的任何其他内容 - 此脚本只是示例。
这可以用jmespath吗?由于项目的限制,目前这是我最好的选择。
答案 0 :(得分:1)
目前无法使用Jmespath删除字段。有待处理的功能请求:
能够根据jmespath#121设置和删除 https://github.com/jmespath/jmespath.py/issues/121
我正在使用jq来做到这一点:
jq 'del(.foo)'
Input {"foo": 42, "bar": 9001, "baz": 42}
Output {"bar": 9001, "baz": 42}