问题描述
{
"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","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","fiscal":
{
"fiscalDocument": {
"fiscalDocumentID": "0003006170","fiscalDocumentCategory": "ZW"
}
}
}
]
}
我已经用map
和mapObject
尝试了一些代码,但是都没有用。
FISCAL.DOC_DOCNUM
等于FISCAL.DOCNUM
,但是如果变换适合位置,则可能会更好。我的意思是,将ACCOUNTING的第一个元素与FISCAL的第一个元素结合在一起,依此类推...如果有人还可以通过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_NFTYPE和DOC_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
}
}
}
}
您还可以按照您希望看到的那样在两个数组上使用连接函数
%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
}
}
}
}