JQ выбрать с несколькими условиями - PullRequest
1 голос
/ 27 февраля 2020

У меня есть несколько следующих json объектов, которые я бы хотел отфильтровать с помощью одной команды jq.

[
  {
    "version": "v2",
    "transactionId": "10590541.2280012772",
    "description": {
      "original": "DUMMY",
      "sanitized": "DUMMY A.B. C"
    }
  }
]

или

[
  {
    "version": "v2",
    "transactionId": "10590541.2280012772",
    "description": {
      "original": "DUMMY",
      "sanitized": "DUMMY A.B. C"
    },
    "merchantDetails": {
      "name": "DUMMY"
    }
  }
]

или

[
  {
    "version": "v2",
    "transactionId": "10590541.2280012772",
    "merchantDetails": {
      "name": "DUMMY"
    }
  }
]

Я пытаюсь отфильтровать с помощью jq, поэтому любой из вышеперечисленных json объектов удовлетворяет условию фильтра. Другими словами, если существуют и .merchantDetails.name, и .description.sanitized, тогда .merchantDetails.name должен иметь приоритет при проверке строки "DUMMY". Если нет, то проверьте .merchantDetails.name или .description.sanitized на наличие строки "DUMMY".

В настоящее время у меня есть следующее, что на самом деле не работает.

jq . test.json  | jq '.[] | select( (.merchantDetails.name | try contains ("DUMMY")) or (.description.sanitized | try contains ("DUMMY")) )'

В любом случае, чтобы добиться этого с помощью одной встроенной команды jq?

1 Ответ

1 голос
/ 27 февраля 2020

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

jq '
map (
  objects |
  if   has("merchantDetails") and has("description") then
    select( .merchantDetails.name  | contains("DUMMY"))
  elif has("merchantDetails") then
    select( .merchantDetails.name  | contains("DUMMY"))
  elif has("description") then
    select( .description.sanitized | contains("DUMMY"))
  else empty
  end
)
'
...