Преобразование 1-ко-многим JSON в CSV - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь проанализировать вывод json из вызова API. Вывод имеет массив заказов, а каждый заказ имеет массив элементов. Я хочу проанализировать выходные данные так, чтобы у меня был отдельный выход CSV для каждого отдельного элемента с его идентификатором родительского заказа.

Так что, если один заказ содержит несколько элементов, мне нужно, чтобы orderID повторялся для каждого элемента в его заказе. ,Я прочитал документацию jq и десятки примеров, и несколько часов пробовал проб и ошибок. Я ОЧЕНЬ не понимаю, как это сделать.

Я очень сильно борюсь с синтаксисом синтаксического анализа jq. Ни один из примеров не помогает, и я просто растерялся. Вот основы:

curl -s https://api.site.com/orders?page=1&pageSize=10 | jq '.'

Образец JSON ниже.

{
  "orders": [
    {
      "orderId": 217356098,
      "items": [
        {
          "orderItemId": 327010821,
          "lineItemKey": "1",
          "sku": "AJC-C10S",
          "name": "TestDescription",
          "imageUrl": null,
          "weight": null,
          "quantity": 2,
          "unitPrice": 106.85,
          "taxAmount": null,
          "shippingAmount": null,
          "warehouseLocation": null,
          "options": [],
          "productId": null,
          "fulfillmentSku": null,
          "adjustment": false,
          "upc": null,
          "createDate": "2016-11-09T02:11:28.307",
          "modifyDate": "2016-11-09T02:11:28.307"
        },
        {
          "orderItemId": 327010822,
          "lineItemKey": "1",
          "sku": "AJC-C106",
          "name": "AnotherTestDescription",
          "imageUrl": null,
          "weight": null,
          "quantity": 2,
          "unitPrice": 106.85,
          "taxAmount": null,
          "shippingAmount": null,
          "warehouseLocation": null,
          "options": [],
          "productId": null,
          "fulfillmentSku": null,
          "adjustment": false,
          "upc": null,
          "createDate": "2016-11-09T02:11:28.307",
          "modifyDate": "2016-11-09T02:11:28.307"
        }
      ]
    },
  ],
  "total": 359934,
  "page": 1,
  "pages": 179968
}

Ожидаемый результат (конечно, без заголовков столбцов):

orderId,orderItemId,sku,name
217356098,327010821,"JC-C10S","TestDescription"
217356098,327010822,"JC-C106","AnotherTestDescription"

Как видите, у каждого элемента есть своя строка, но если они пришли из одного порядка,orderId должен повторяться в каждой строке.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

С параметром командной строки -r следующий фильтр jq:

.orders[]
| .orderId as $oid
| .items[]
| [$oid, .orderItemId, .sku, .name]
| @csv

производит желаемый вывод.

Если есть вероятность, что любое из выбранных значений может быть [], подумайте о добавлении строки, подобной следующей, непосредственно перед последней строкой выше:

| map_values(if . == [] then "NONE" else . end)
0 голосов
/ 10 ноября 2019

Спасибо! Это работало с небольшим изменением:

.orders[]
| .orderId as $oid
| .items[]
| [$oid, .items.orderItemId, .items.sku, .items.name | tostring]
| @csv
...