JQ JSON массив смешанных (дублированных) результатов - PullRequest
0 голосов
/ 24 мая 2018

У меня есть массив JSON, из которого я хочу извлечь значения (используя jq):

Это сокращенный пример

{
  "query": "",
  "results": [
  {
      "id": 111,
      ...
      "buyer": {
        "email": "mail1@mail.com",
        ...
        "billing_info": {
          "doc_number": "123"
        }
      }
    },
    {
      "id": 222,
      ...
      "buyer": {
        "email": "mail2@mail.com",
        ...
        "billing_info": {
          "doc_number": "456"
        }
      }
    }
  ]
}

В настоящее время я использую этот фильтр:

{user: .results[].id, mail: .results[].buyer.email, buyer: .results[].buyer.billing_info.doc_number}

И я получаю результат "полное соединение".

{"user":111,"mail":"mail1@mail.com","buyer":"123"}
{"user":111,"mail":"mail1@mail.com","buyer":"456"}
{"user":111,"mail":"mail2@mail.com","buyer":"123"}
{"user":111,"mail":"mail2@mail.com","buyer":"456"}
{"user":222,"mail":"mail1@mail.com","buyer":"123"}
{"user":222,"mail":"mail1@mail.com","buyer":"456"}
{"user":222,"mail":"mail2@mail.com","buyer":"123"}
{"user":222,"mail":"mail2@mail.com","buyer":"456"}

Я хочу отфильтровать некоторые поля из полного объекта.Итак, в этом примере у меня есть 2 объекта, поэтому я хочу получить 2 результата:

{"user":111,"mail":"mail1@mail.com","buyer":"123"}
{"user":222,"mail":"mail2@mail.com","buyer":"456"}

Вот фрагмент из моего примера:

https://jqplay.org/s/nM1WzWRmnK

Спасибо всем!

1 Ответ

0 голосов
/ 24 мая 2018

Вам просто нужно «поднять» итератор (.results[]) вперед:

.results[] 
| {user: .id, mail: .buyer.email, buyer: .buyer.billing_info.doc_number}

С параметром командной строки -c вы получите:

{"user":111,"mail":"mail1@mail.com","buyer":"123"}
{"user":222,"mail":"mail2@mail.com","buyer":"456"}

Это может помочь думать о (ARRAY[] | ...) в jq как о for (x in ARRAY) {...} в других языках.

...