通过dataweave 2.0上不同json元素的位置连接数据



我有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"
}
}
}
]
}

我已经用mapmapObject尝试了一些代码,但都不起作用。

FISCAL.DOC_DOCNUM等于FISCAL.DOCNUM,但如果变换符合位置,则可能更好。我的意思是,把ACCOUNTING的第一个元素和FISCAL的第一个结合起来,等等……如果有人也能通过ID提供转换结合,那就太好了,供将来参考。

这样的东西应该能在中工作

%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
}
}
}
}

您也可以在两个数组上使用连接函数,正如您所提到的,您希望看到

%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
}
}
}
}

试试看。

%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下的数据。行有DOC_NFTYPE和DOC_INVTYPE。因此在上面的函数中使用了默认值来获得所需的值。

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

最新更新