在dataweave 2.0上按不同json元素的位置连接数据

在dataweave 2.0上按不同json元素的位置连接数据,json,mule,dataweave,Json,Mule,Dataweave,我有一个SAP函数的JSON输出: { "Z_HYD_GET_INVOICES": { "import": { "BRANCH": "0142", "DOCNUMS": null, "FINAL_DATE": "Tue Oct 08 00:00:00 BST 2019&qu

我有一个
SAP
函数的
JSON
输出:

{
    "Z_HYD_GET_INVOICES": {
        "import": {
            "BRANCH": "0142",
            "DOCNUMS": null,
            "FINAL_DATE": "Tue Oct 08 00:00:00 BST 2019",
            "INITIAL_DATE": "Mon Oct 07 00:00:00 BST 2019"
        },
        "export": {
            "ACCOUNTING": {
                "row": {
                    "DOCNUM": "0002990790",
                    "PSTDAT": "Mon Oct 07 00:00:00 BST 2019",
                    "BUKRS": "TRV"
                },
                "row": {
                    "DOCNUM": "0003006170",
                    "PSTDAT": "Mon Oct 07 00:00:00 BST 2019",
                    "BUKRS": "TRV"
                }
            },
            "FISCAL": {
                "row": {
                    "DOC_DOCNUM": "0002990790",
                    "DOC_NFTYPE": "ZW"
                },
                "row": {
                    "DOC_DOCNUM": "0003006170",
                    "DOC_INVTYPE": "ZW"
                }
            },
            "MESSAGE_RETURN": null,
            "STATUS_RETURN": null
        }
    }
}
我希望它是这样的:

{
  "invoices": [
    {
      "accounting": 
        {
          "accountingDocumentID": "0002990790",
          "taxEntryDate": "Mon Oct 07 00:00:00 BST 2019",
          "company": "TRV"
        },
      "fiscal": 
        {
          "fiscalDocument": {
            "fiscalDocumentID": "0002990790",
            "fiscalDocumentCategory": "ZW"
          }
        }
    },
    {
    "accounting": 
        {
          "accountingDocumentID": "0003006170",
          "taxEntryDate": "Mon Oct 07 00:00:00 BST 2019",
          "company": "TRV"
        },
    "fiscal": 
        {
          "fiscalDocument": {
            "fiscalDocumentID": "0003006170",
            "fiscalDocumentCategory": "ZW"
          }
        }
    }
  ]
}
我已经用
map
mapObject
尝试了一些代码,但都不起作用

FISCAL.DOC\u DOCNUM
等于
FISCAL.DOCNUM
,但最好根据位置确定转换是否合适。我的意思是,把会计的第一个要素和财政的第一个要素结合起来,等等。。。如果有人也能通过ID提供转换连接,那就太好了,供将来参考。

试一试

%dw 2.0
output application/json
fun returnFiscalDoc (docnum) = {
    fiscalDocument : {(payload.Z_HYD_GET_INVOICES.export.FISCAL.*row filter ($.DOC_DOCNUM ~= docnum) map  {
        fiscalDocumentID: $.DOC_DOCNUM,
        fiscalDocumentCategory: $.DOC_NFTYPE default $.DOC_INVTYPE
    })}
}
---
invoices: payload.Z_HYD_GET_INVOICES.export.ACCOUNTING.*row map {
   accounting : 
     {
         accountingDocumentID: $.DOCNUM,
         taxEntryDate: $.PSTDAT,
         company:$.BUKRS
     },
   fiscal: returnFiscalDoc($.DOCNUM)
}
但是请记住,FISCA.row下的数据有DOC\u NFTYPE和DOC\u INVTYPE。因此,在上面的函数中使用default来获得所需的值

"FISCAL": {
                "row": {
                    "DOC_DOCNUM": "0002990790",
                    "DOC_NFTYPE": "ZW"
                },
                "row": {
                    "DOC_DOCNUM": "0003006170",
                    "DOC_INVTYPE": "ZW"
                }
            }

像这样的东西应该有用

%dw 2.0
output application/json
var filteredExport = (payload.Z_HYD_GET_INVOICES."export") filterObject ($$ ~= "ACCOUNTING" or $$ ~= "FISCAL")
var filteredExportArray = filteredExport pluck $
var accounting = filteredExport.ACCOUNTING pluck $
var fiscal = filteredExport.FISCAL pluck $
---
{
    invoices: filteredExportArray map {
        accounting: {
            accountingDocumentID: accounting[$$].DOCNUM,
            taxEntryDate: accounting[$$].PSTDAT,
            company: accounting[$$].BUKRS
        },
        fiscal: {
            fiscalDocument: {
                fiscalDocumentID: fiscal[$$].DOC_DOCNUM,
                fiscalDocumentCategory: if(!isEmpty(fiscal[$$].DOC_NFTYPE)) fiscal[$$].DOC_NFTYPE else if(!isEmpty(fiscal[$$].DOC_INVTYPE)) fiscal[$$].DOC_INVTYPE else null
            }
        }
    }
}

您还可以在两个数组上使用join函数,正如您所提到的那样

%dw 2.0
import * from dw::core::Arrays
output application/json
var filteredExport = (payload.Z_HYD_GET_INVOICES."export") filterObject ($$ ~= "ACCOUNTING" or $$ ~= "FISCAL")
var accounting = filteredExport.ACCOUNTING pluck $
var fiscal = filteredExport.FISCAL pluck $
var joined = leftJoin(accounting, fiscal, (a) -> a.DOCNUM, (f) -> f.DOC_DOCNUM)
---
{
    invoices: joined map {
        accounting: {
            accountingDocumentID: $.l.DOCNUM,
            taxEntryDate: $.l.PSTDAT,
            company: $.l.BUKRS
        },
        fiscal: {
            fiscalDocument: {
                fiscalDocumentID: $.r.DOC_DOCNUM,
                fiscalDocumentCategory: $.r.DOC_NFTYPE
            }
        }
    }
}

我忘了更改示例的所有键,抱歉。。。但伟大的解决方案,它帮助我了解当这种情况发生时该怎么办。谢谢我忘了更改示例的所有键。我认为你的答案比另一个更有条理,所以我选择了它作为最佳答案。谢谢通过ID连接项目有
join()
函数和类似的函数(
leftJoin
outerJoin
等)。这些是核心阵列DW库的一部分。请记住,要使用这些函数,必须在脚本头中包含
import*from dw::core::Arrays
。裁判: