обновить элементы массива с помощью try catch - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь обновить большие сложные json-файлы и выйти с подробным сообщением об ошибке при обнаружении несогласованных данных (с jq 1.6).

Я начал использовать функции и попытаться / поймать, чтобы создать вид Javaтрассировка стека, содержащая входные данные с каждого уровня => просто, спасибо JQ

Но когда я начал обновлять элементы массива (используя | =), я не нашел решения

Воточень простой пример:

echo '{"array": [{"foo":"bar"}]}' | jq -c '.array[] |= try . catch (.)'
output : {"array":[{"__jq":0}]}

Я сделал ошибку?Это нормальное поведение?

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Вы наткнулись на ошибку в JQ 1.6.Используя jq 1.5, можно получить правильный вывод:

{"array":[{"foo":"bar"}]}

Однако выражение .array[] |= try . catch (.) на практике не используется, потому что если .array - это массив JSON или объект JSON, он просто говорит: ничего не делать.

Чтобы понять try ... catch ..., может помочь следующий пример:

$ jq -n 'try error("abc") catch ("The error message was " + .)'
"The error message was abc"
0 голосов
/ 26 февраля 2019

Try-catch на самом деле не является выражением, оно не дает значимого значения, оно просто выполняет некоторое выражение:

try-catch

Ошибки могут быть обнаружены с помощью try EXP catch EXP. Первое выражение выполняется, а если оно терпит неудачу, то второе выполняется с сообщением об ошибке. Вывод обработчика, если он есть, выводится так, как если бы он был выводом выражения, которое нужно попробовать.

выделение мое.

Так что было бы неправильно использовать значение, вы должны выполнить присваивание в выражении try.

$ echo '{"array": [{"foo":"bar"}]}' | jq -c 'try (.array[] |= .) catch (.)'
...