2017-01-10 4 views
6

Я пытаюсь фильтровать свойства объекта в jmespath на основе значения подзадачи и хочу включать только те свойства, где для подзадачи установлено определенное значение.Фильтровать объект по свойству и выбрать с помощью ключа в jmespath

Основываясь на этом примере данные:

{ 
    "a": { 
    "feature": { 
     "enabled": true, 
    } 
    }, 
    "b": { 
    }, 
    "c": { 
    "feature": { 
     "enabled": false 
    } 
    } 
} 

Я хотел бы получить объект со всеми свойствами, где функция включена.

{ 
    "a": { 
    "feature": { 
     "enabled": true, 
    } 
    } 
} 

Я полагал, что я мог бы использовать этот jmespath запрос для фильтрации объектов, где property. enabled устанавливается истина. Unfortunateley, похоже, не работает и вместо этого возвращает пустой массив.

*[?feature.enabled==`true`] 

*.feature.enabled или *[feature.enabled] возвращать не только логические значения без какого-либо контекста.

Даже если *[?feature.enabled== правда ] будет работать, это будет просто массив значений свойств, но мне нужны ключи (a и c), а также. Есть ли способ сделать это в jmespath?

Это часть незанятой пьесы, поэтому, конечно, есть способ добиться выбора по-другому (шаблоны Jinja2 или пользовательский плагин), но я хотел попробовать jmespath и рассуждать, что он должен быть способен такая задача.

+0

Больше чем что-либо запрашивать, вы хотите удалить определенные ключи на основе вложенных данных. Что-то вроде [этот вопрос для Perl] (http://stackoverflow.com/q/18660309/2947502). Я тоже хотел бы знать, можете ли вы сделать это с помощью JMESPath. – techraf

ответ

3

Извините, но AFAIK это невозможно в родной JMESPath.
Для этой цели есть специальные встроенные функции в различных инструментах, таких как to_entries в jq.
Для jmespath.py и, следовательно, для Ansible существует подвеска pull request для реализации манипуляций с ключами.

Обновление: Я сделал исправленную версию фильтра json_query.
См. this ответ на дополнительную информацию.

+0

Спасибо, я слежу за этим запросом на растяжение, и пока я решил эту проблему с помощью цикла jinja2, чтобы выбрать соответствующие словарные элементы и объединить их в новый dict. –

+0

Я [моя проблема] (/ questions/46306363 /) так же неразрешима, пока этот PR не слит? Благодаря! –