Сопоставить вложенный массив json в CSV

Я пытаюсь отобразить полезную нагрузку массива в CSV в Dataweave и не могу добиться результата.

CSV не будет нуждаться в заголовке, содержимое массива будет печататься столбец за столбцом. Я столкнулся с проблемой сопоставления через вложенный массив.

Введите полезную нагрузку

[
  {
  "Invoice": {
    "Invoice Number*": "Test",
    "Supplier Number": "1201",
    "Submit For Approval?": "Yes",
    "Invoice Date*": "20190828",
    "Line Level Taxation*": "Yes",
    "Payment Date": "00/00/0000",
    "Original invoice number": "",
    "Original invoice date": ""
  },
  "Invoice Line": [
    {
      "Invoice Number*": "Test1",
      "Line Number": "1",
      "Description*": "Test1",
      "Price*": "500",
      "Quantity": null,
      "Unit of Measure*": null,
      "PO Number": "001",
      "PO Line Number": "1"
    },
    {
      "Invoice Number*": "Test2",
      "Line Number": "2",
      "Description*": "Test2",
      "Price*": "500",
      "Quantity": null,
      "Unit of Measure*": null,
      "PO Number": "001",
      "PO Line Number": "2"
    }
  ],
  "Invoice Tax Line": [
     {
       "Tax Amount": "500",
       "Invoice Line Number": "1",
       "Line Number": "1"
     },
     {
       "Tax Amount": "50",
       "Invoice Line Number": "2",
       "Line Number": "2"
     }
  ]
  }
]

Ожидаемый результат

column_0, column_1, column_2 ... //no header
"Invoice Number*","Supplier Number","Submit For Approval?"... //Invoice
"Invoice Number*","Line Number*"...                        //InvoiceLine[0]
"Tax Amount","Invoice Line Number","Line Number"...        //Tax Line[0]
"Invoice Number*","Line Number*"...                        //InvoiceLine[1]
"Tax Amount","Invoice Line Number","Line Number"...        //Tax Line[1]

Как я могу написать сопоставление dataweave, чтобы заархивировать результат, как указано выше?


person Shawn.Y    schedule 05.09.2019    source источник


Ответы (1)


Это решение, которое я нашел для вашего варианта использования. По сути, есть две функции, которые отправляют правильный метод в соответствии с типом. Затем вы также хотите использовать функцию zip для смешайте одну «строку счета-фактуры» с одной «строкой налога-фактуры», чтобы они смешались правильно.

%dw 2.0
output application/csv headers=false 
import * from dw::core::Objects

fun collectKeyNames(obj: {}): Array<{}> = 
            [
                obj
            ]

fun collectKeyNames(arr: Array): Array<{}> = 
    arr flatMap ((obj, index) ->  collectKeyNames(obj))

---
payload flatMap ((item, index) -> 
    collectKeyNames(item.Invoice) ++ 
        (collectKeyNames(item."Invoice Line" zip item."Invoice Tax Line"))
)
person machaval    schedule 05.09.2019
comment
Спасибо @machaval! Это работает так, как я хочу. Однако не могли бы вы подробнее объяснить, что работает функция collectKeyNames? Поскольку я на самом деле планирую внести некоторые изменения, чтобы указать столбец каждого объекта, будет печататься - person Shawn.Y; 06.09.2019
comment
Итак, в основном у вас есть массив объектов или просто массив объектов, поэтому я переопределил функцию двумя параметрами: либо Array, либо Object. Если это Object, просто соберите объект, а если это Array, соберите все объекты, которые находятся внутри, и сгладьте их. Я пользуюсь динамической рассылкой. - person machaval; 09.09.2019