2015-12-07 3 views
0

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

Например, при следующем входе

{ 
"object1": { 
"Type": "Type1", 
"Properties": { 
    "Property1": "blablabla", 
    "Property2": [ 
    { 
     "Key": "Name", 
     "Value": "xxx" 
    }, 
    { 
     "Key": "Surname", 
     "Value": "yyy" 
    } 
    ], 
    "Property3": "xxx" 
} 
}, 
"object2": { 
"Type": "Type2", 
"Properties": { 
    "Property1": "blablabla", 
    "Property2": [ 
    { 
     "Key": "Name", 
     "Value": "xxx" 
    }, 
    { 
     "Key": "Surname", 
     "Value": "yyy" 
    } 
    ], 
    "Property3": "xxx" 
    } 
} 
} 

Я хотел бы построить фильтр, который в зависимости от типа объекта, скажем, «TYPE2», удаляет или очищает свойство этого объекта, скажем, свойство2. Результирующий выходной сигнал будет затем:

{ 
"object1": { 
"Type": "Type1", 
"Properties": { 
    "Property1": "blablabla", 
    "Property2": [ 
    { 
     "Key": "Name", 
     "Value": "xxx" 
    }, 
    { 
     "Key": "Surname", 
     "Value": "yyy" 
    } 
    ], 
    "Property3": "xxx" 
} 
}, 
"object2": { 
"Type": "Type2", 
"Properties": { 
    "Property1": "blablabla", 
    "Property3": "xxx" 
    } 
} 
} 

Любая помощь высокую оценку. Заранее спасибо.

ответ

0

Довольно простой. Найдите объекты, которые вы хотите обновить, а затем обновите их.

Просмотрите значения вашего корневого объекта, фильтруя их на основе вашего состояния, обновите свойство Properties, удалив требуемое свойство.

(.[] | select(.Type == "Type2")).Properties |= del(.Property2) 

Использование .[] на объекте дает все значения свойств объекта. Также стоит упомянуть, когда вы обновляете значение с помощью назначений, результат выражения просто возвращает ввод (другими словами, он не меняет контекст).

+0

Спасибо. Кажется, что это нормально для точных совпадений. Возможно ли это для регулярных выражений? Я пытаюсь: '. [" Resources "] | (. [] | Select (.Type | match (" type2 ";" i ")?)). Свойства | = del (.Property2)' Это, похоже, не работает. –

+0

В этом случае вы хотели бы использовать 'test', но похоже, что при использовании фильтров регулярных выражений возникает проблема с приоритетом. 'Неверное выражение пути рядом с попыткой доступа к элементу" Свойства "...' Кажется, это делается только при попытке выполнить обновление/переназначение. Кажется, это ошибка в парсере для меня. –

0

Прямой подход:

.[] |= (if .Type == "Type2" then delpaths([["Properties", "Property2"]]) else . end) 
+0

Не могли бы вы рассказать о том, как решить проблему? – Phani

Смежные вопросы