2017-02-14 2 views
0

Рассмотрим следующий JQ конфигурации:Jq: тестирует поле во время прогулки

walk 
( 
    if (type == "object" and .key | test("something")) then 
    del(.) 
    else 
    . 
    end 
) 

И следующий JSON:

[ 
    { 
    "key": "something", 
    "value": "something" 
    }, 
    { 
    "key": "another thing", 
    "value": "another thing" 
    }, 
    { 
    "key": "something", 
    "value": "something" 
    } 
] 

Однако JQ бросками следующие ошибки:

jq: error (at :13): boolean (false) cannot be matched, as it is not a string

13 является последняя строка ввода. Какое логическое значение он пытается совместить?

ответ

1

Обычно walk() здесь не требуется. Я хотел бы использовать map() так:

jq 'map(select(.key!="something"))' 

Об ошибке вы сообщили, вы упускаете круглые скобки. Оно должно быть:

jq 'walk(if(type == "object" and (.key | test("something"))) then del(.) else . end)' 
           ^     ^
+0

@ hek2gml Благодаря –

+0

Вы радушны – hek2mgl

+0

Я получаю 'JQ: нулевая ошибка (нуль) не может быть сопоставлен, так как это не строка при попытке использовать это Если я изменю его на (.key = test («something»)), я получаю 'object ({" autoprefi ...) не может быть сопоставлен, поскольку это не строка ' –

1
  1. Как @ hek2mgl объяснил, ответ на ваш вопрос о сообщении об ошибке, что (X and Y | Z) обрабатывается как (X and Y) | Z.

  2. Основная проблема с вашим запросом - возникновение del(.). «.» в этом случае относится к объекту, и поэтому использование del/1 здесь просто неверно. Поскольку не совсем ясно, что вы пытаетесь сделать, позвольте мне рискнуть предположить, что он должен удалить объект (.) Сам. Это может быть сделано с помощью empty:

walk(if type == "object" and (.key | test("something")) 
    then empty 
    else . end) 

робастно:

walk(if type == "object" and (.key | (type == "string" and test("something"))) 
    then empty 
    else . end) 
+0

Когда я пытаюсь запустить предложение из 2. Я получаю 'jq: error (at test.json: 76): null (null) не может быть сопоставлен, так как это не строка' –

+0

Моя догадка что вам нужно добавить тест, чтобы проверить, что у объекта есть ключ. Это можно сделать, используя has («key»). Вы также можете проверить его значение в строке. – peak

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