JQ пустой результат, выберите по массиву - PullRequest
0 голосов
/ 10 января 2020

с учетом следующего JSON:

{
  "id": "4",
  "j": [
    {
      "f": 1,
      "d": "x1"
    },
    {
      "f": 2,
      "d": "x2"
    },
    {
      "f": 3,
      "d": "x3"
    }
  ]
}

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

работает должным образом:

{k:.id,m:.j[] | select(.f==3)|.d}

https://jqplay.org/s/E8rS0Mf_so

пусто:

{k:.id,m:.j[] | select(.f==4)|.d}

желаемый результат должен выглядеть примерно так:

{
  "k": "4",
  "m": null
}

решение, предложенное в Как управлять пустыми результатами выбора работает нелегко

{k:.id,m:(.j[] | select(.f==4)|.d//null)}

ни с вопросительным знаком, как предлагается в документации, рядом с альтернатива

Ответы [ 2 ]

1 голос
/ 10 января 2020

Это просто вопрос скобок.

С вашими данными следующая модификация вашего исходного запроса дает следующий результат:

{k:.id, m: ((.j[] | select(.f==4)|.d) // null)}
Результат:
{"k":"4","m":null}
0 голосов
/ 10 января 2020

после того, как вы хорошо спали ночью и попробовали то, что руководство может предложить по этому наиболее простому решению, которое я придумал, это

{k:.id,m:[.j[] | select(.f==4)|.d][0]}

https://jqplay.org/s/Ao8_GuHWI4

Я не читал всего руководства, но, думаю, в какой-то момент оно скажет, что оно падает на множественность частичных результатов или что-то, что даст более одного результата, если при выборе будет найдено больше элементов !

в данном решении это не преобладает, возвращая только 1 результат, даже если выборка будет соответствовать большему количеству элементов

, однако вы можете обойти это, фактически сделав это правильно с альтернативным оператором; )

{k:.id,m:([.j[] | select(.f==4)|.d][]//null)}

https://jqplay.org/s/uBG5c969pf

...