Извлечение значений с помощью jq только в том случае, если они существуют

#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. Я обнаружил ошибку, требующую информации не в моем первоначальном вопросе, а в том, что вызвало сбой. Это означает, что я думаю, что это плохой вопрос, но я оставляю его, потому что упоминание оператора подавления ошибок и механизмов перехвата попыток может быть полезно другим