0

我有这个简单的 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 吗?由于项目的限制,这是目前我最好的选择。

4

1 回答 1

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}
于 2018-04-18T11:00:24.363 回答