Фильтрация Json с помощью jmespath

У меня есть этот простой скрипт 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-receive- rpt-сообщение-отметка времени. И в совершенстве я хотел бы сохранить все остальное, хотя могу жить с потерей топологии и тегов узлов.

Дело в том, что я могу использовать только один jmespath.search и могу выполнить только одно выражение jmespath. Также я не могу использовать что-либо еще из Python - этот скрипт просто пример.

Возможно ли это с помощью jmespath? В настоящее время это мой лучший вариант из-за ограничений проекта.


person HAXiAL    schedule 15.12.2017    source источник
comment
Вопрос в том, нужно ли для этого использовать JMES? То, что вы пытаетесь сделать, было бы намного проще сделать с помощью MongoDB или другого механизма, основанного на документах без sql.   -  person Tetlanesh    schedule 05.01.2018


Ответы (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}
person mromer    schedule 18.04.2018