【问题标题】:Map nested json array into CSV将嵌套的 json 数组映射到 CSV
【发布时间】:2019-09-05 15:59:37
【问题描述】:

我正在尝试将数组有效负载映射到 Dataweave 中的 CSV,但无法获得结果。

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 映射来归档上述结果?

【问题讨论】:

    标签: mule dataweave


    【解决方案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"))
    )
    

    【讨论】:

    • 谢谢@machaval!它的工作是我想要的。但是,您能否就 collectKeyNames 函数的工作原理提供更多解释?因为我实际上计划进行一些修改以指定每个 obj 的列将打印
    • 所以基本上你有一个对象数组或只是一个对象数组,所以我所做的是用两个选项覆盖函数,它是ArrayObject。如果是Object,只需收集对象,如果是Array,则收集里面的所有对象并将它们展平。我利用了动态调度。
    猜你喜欢
    • 2017-02-28
    • 2017-04-19
    • 1970-01-01
    • 2020-03-19
    • 2021-07-06
    • 2012-09-24
    • 1970-01-01
    • 2023-02-14
    • 2020-04-01
    相关资源
    最近更新 更多