Как объединить объекты JSON в определенных полях, используя jq? - PullRequest
0 голосов
/ 03 февраля 2019

У меня следующая структура JSON:

{
  "Reservations": [
    {
      "Id": "R-1",
      "CustomerId": "1"
    },
    {
      "Id": "R-2",
      "CustomerId": "2"
    }
  ],
  "Customers": [
    {
      "Id": "1",
      "Name": "customer 1"
    },
    {
      "Id": "2",
      "Name": "customer 2"
    },
    {
      "Id": "3",
      "Name": "customer 3"
    }
  ]
}

Я хочу присоединиться к Reservations с Customers и получить что-то вроде этого:

{
  "ReservationId": "R-1",
  "CustomerName": "customer 1"
}
{
  "ReservationId": "R-2",
  "CustomerName": "customer 2"
}

Я играл с jq, пробовал использовать несколько фильтров, разделенных запятой, пробовал использовать переменные, читать документы, но кажется, что выполнение таких простых задач невозможно с jq.Или я что-то упустил?

1 Ответ

0 голосов
/ 04 февраля 2019

Вот простое решение с использованием INDEX/2:

INDEX(.Customers[]; .Id) as $c
| .Reservations[]
| { ReservationId: .Id,
    CustomerName: $c[.CustomerId].Name }

Если ваш jq не имеет INDEX/2, то сейчас самое время обновить;в противном случае вы можете скопировать и вставить его определение из https://github.com/stedolan/jq/blob/master/src/builtin.jq, или использовать INDEX/3, как указано ниже.

INDEX / 3

def INDEX(s; k; v):
  reduce s as $x ({}; .[$x|k] = ($x|v));

INDEX(.Customers[]; .Id; .Name) as $c
| .Reservations[]
| { ReservationId: .Id,
    CustomerName: $c[.CustomerId] }
...