#jq
Вопрос:
У меня есть большой файл записей, которые содержат поля, которые выглядят примерно так:
{
"id": "1000001",
"updatedDate": "2018-12-21T01:52:00Z",
"createdDate": "1993-11-30T02:59:25Z",
"varFields": [
{
"fieldTag": "b",
"content": "1000679727"
},
{
"fieldTag": "v",
"content": "v.1"
}
}
Мне нужно извлечь элемент .content вместе с другими вещами, но только если связанный с ним тег поля «v». Только некоторые записи содержат метку поля «v».
Когда я пытаюсь проанализировать с помощью
(.varFields[] |select(.fieldTag=="v") | "(.content)") // ""
это работает нормально, пока присутствует v. Однако, когда его нет, я получаю
jq: error (at <stdin>:353953): Cannot iterate over null (null)
Я попытался избавиться от ошибки с несколькими вариантами, в том числе с последствиями
(select((.varFields[] |select(.fieldTag=="v") | .content) != null) | .varFields[] |select(.fieldTag=="v") | "(.content)") // ""
но я все еще получаю ту же ошибку. Что я упускаю?
Ответ №1:
Взгляните на оператор подавления ошибок?, который работает немного как новый ?. обнуляемый оператор цепочки в Javascript.
The ? operator, used as EXP?, is shorthand for try EXP.
Example:
jq '[.[]|(.a)?]'
Input [{}, true, {"a":1}]
Output [null, 1]
Они имеют немного проще наглядный пример этого на https://jqplay.org/jq?q=[.[]|(.а)%3Ф%5Дamp;Дж=%5Б%7Б%7Д%2С true%2С %7Б»а»%3А1%7Д%5Д и попробовать-поймать оператором является аналогичной, если все, что вам нужно, это пользовательскую обработку ошибок (или просто игнорирует ошибку…).
Комментарии:
1. Я обнаружил ошибку, требующую информации не в моем первоначальном вопросе, а в том, что вызвало сбой. Это означает, что я думаю, что это плохой вопрос, но я оставляю его, потому что упоминание оператора подавления ошибок и механизмов перехвата попыток может быть полезно другим