DataWeave 2.0嵌套数组转换

问题描述 投票:0回答:2

我正在尝试使用Dataweave 2.0从以下源/目标结构中获取数据。我已经尝试过使用嵌套映射和减少脚本的各种方法,但是有一些困难。

痛点是customFieldList,我想通过将根字段更改为scriptId来简化整体结构(为简便起见,现在)。

任何建议/帮助将不胜感激。

源结构

{
    "line": [{
            "lineNumber": 0,
            "credit": 17.98,
            "customFieldList": {
                "customField": [{
                        "internalId": "5780",
                        "scriptId": "custcol_del_externalid",
                        "value": "0000000111111"
                    },
                    {
                        "internalId": "1446",
                        "scriptId": "custcol_4601_witaxapplies",
                        "value": false
                    },
                    {
                        "internalId": "1837",
                        "scriptId": "custcol_nsts_gaw_col_approver",
                        "value": {
                            "internalId": "29540",
                            "name": "Alan Mcgee",
                            "typeId": "-4"
                        }
                    },
                    {
                        "internalId": "2648",
                        "scriptId": "custcol_foreign_expense",
                        "value": false
                    }
                ]

            }
        },
        {
            "lineNumber": 1,
            "debit": 17.98,
            "customFieldList": {
                "customField": [{
                        "internalId": "5780",
                        "scriptId": "custcol_del_externalid",
                        "value": "0000000111111"
                    },
                    {
                        "internalId": "1446",
                        "scriptId": "custcol_4601_witaxapplies",
                        "value": false
                    },
                    {
                        "internalId": "1837",
                        "scriptId": "custcol_nsts_gaw_col_approver",
                        "value": {
                            "internalId": "29540",
                            "name": "Joe Davis",
                            "typeId": "-4"
                        }
                    },
                    {
                        "internalId": "2648",
                        "scriptId": "custcol_foreign_expense",
                        "value": false
                    }
                ]

            }
        }

    ]
}

目标结构

{
    "line": [{
            "lineNumber": 0,
            "credit": 17.98,

            "custcol_del_externalid": {
                "value": "0000000111111",
                "internalId": "5780"
            },
            "custcol_4601_witaxapplies": {
                "value": false,
                "internalId": "1446"
            },
            "custcol_nsts_gaw_col_approver": {
                "value": false,
                "internalId1": "1837",
                "internalId2": "29540",
                "name": "Alan Mcgee",
                "typeId": "-4"
            },
            "custcol_foreign_expense": {
                "value": false,
                "internalId": "2648"
            }
        },
        {
            "lineNumber": 1,
            "debit": 17.98,

            "custcol_del_externalid": {
                "value": "0000000111111",
                "internalId": "5780"
            },
            "custcol_4601_witaxapplies": {
                "value": false,
                "internalId": "1446"
            },
            "custcol_nsts_gaw_col_approver": {
                "value": false,
                "internalId1": "1837",
                "internalId2": "29540",
                "name": "Joe Davis",
                "typeId": "-4"
            },
            "custcol_foreign_expense": {
                "value": false,
                "internalId": "2648"
            }
        }

    ]
}
arrays dataweave mulesoft
2个回答
1
投票

结构可能有点复杂,最好简化一下,但是我发现的真正问题是试图从customField中的其他条目中添加多个internalId。我正在共享无法解决该部分但似乎与输出的其余部分匹配的脚本:

%dw 2.0
output application/json skipNullOn="objects"
---
{
    line: payload.line map (field, index1) -> {
        lineNumber: field.lineNumber,
        credit: field.credit,
        debit: field.debit,
        (field.customFieldList.customField map (val, index2) ->
                {
                    (val.scriptId): {
                        value: val.value,
                        internalId: val.internalId
                    }
                }
        )    
    }
}

输出:

{
  "line": [
    {
      "lineNumber": 0,
      "credit": 17.98,
      "custcol_del_externalid": {
        "value": "0000000111111",
        "internalId": "5780"
      },
      "custcol_4601_witaxapplies": {
        "value": false,
        "internalId": "1446"
      },
      "custcol_nsts_gaw_col_approver": {
        "value": {
          "internalId": "29540",
          "name": "Alan Mcgee",
          "typeId": "-4"
        },
        "internalId": "1837"
      },
      "custcol_foreign_expense": {
        "value": false,
        "internalId": "2648"
      }
    },
    {
      "lineNumber": 1,
      "debit": 17.98,
      "custcol_del_externalid": {
        "value": "0000000111111",
        "internalId": "5780"
      },
      "custcol_4601_witaxapplies": {
        "value": false,
        "internalId": "1446"
      },
      "custcol_nsts_gaw_col_approver": {
        "value": {
          "internalId": "29540",
          "name": "Joe Davis",
          "typeId": "-4"
        },
        "internalId": "1837"
      },
      "custcol_foreign_expense": {
        "value": false,
        "internalId": "2648"
      }
    }
  ]
}

可能已经解决,但是我现在没有更多时间。如果您可以简化结构或输出,将会更容易。

为了更快,我使用了writer属性skipNullOn来避免在它们为空时发出贷方和借方属性。


0
投票

让我开始说您的输出缺少Joe Davis,您显示两次Alan Mcgee,我认为是一个错字。

我正在做出某些假设才能使其正常工作。我的假设是(1)如果value是对象,则存在internalId字段,并且(2)从value字段中发生了一次嵌套-即仅此而已。

我可能可以简化一下或扩展它-我现在没有时间。

仅供参考:请确认您所需要的,我没有时间进行详尽的检查。

这是我的代码,它是独立的,因此只需复制并粘贴到Transform Message处理器中。

编辑:我花了一些额外的时间,稍微更改了表达式,并添加了注释以解释表达式的作用。希望对您有所帮助。

%dw 2.0
output application/dw

var data = {
    "line": [{
            "lineNumber": 0,
            "credit": 17.98,
            "customFieldList": {
                "customField": [{
                        "internalId": "5780",
                        "scriptId": "custcol_del_externalid",
                        "value": "0000000111111"
                    },
                    {
                        "internalId": "1446",
                        "scriptId": "custcol_4601_witaxapplies",
                        "value": false
                    },
                    {
                        "internalId": "1837",
                        "scriptId": "custcol_nsts_gaw_col_approver",
                        "value": {
                            "internalId": "29540",
                            "name": "Alan Mcgee",
                            "typeId": "-4"
                        }
                    },
                    {
                        "internalId": "2648",
                        "scriptId": "custcol_foreign_expense",
                        "value": false
                    }
                ]

            }
        },
        {
            "lineNumber": 1,
            "debit": 17.98,
            "customFieldList": {
                "customField": [{
                        "internalId": "5780",
                        "scriptId": "custcol_del_externalid",
                        "value": "0000000111111"
                    },
                    {
                        "internalId": "1446",
                        "scriptId": "custcol_4601_witaxapplies",
                        "value": false
                    },
                    {
                        "internalId": "1837",
                        "scriptId": "custcol_nsts_gaw_col_approver",
                        "value": {
                            "internalId": "29540",
                            "name": "Joe Davis",
                            "typeId": "-4"
                        }
                    },
                    {
                        "internalId": "2648",
                        "scriptId": "custcol_foreign_expense",
                        "value": false
                    }
                ]

            }
        }

    ]
}

---
// Create a new object with a single field named `line`
// Iterate over the array in the `data.line`
line: data.line map {  // Create an object where
    // you remove the `customFieldList` from the inputs while maintaining the other fields
    ($ - "customFieldList"),
    // Create an object with field names the values of the `scriptId` field.
    (do { // Create a localized declaration (aka closure) changing the array into an object
          // where each field is the value of the `scriptId` field
        var cfs = $.customFieldList.customField groupBy $.scriptId
        ---
        // Iterate over the custom fields (cfs) object
        cfs mapObject (v,k) -> (
            // The value is an array but I assume you will always have a single element in it.
            // Take the only element in the array (while removing the `scriptId` field) and test it
            (v[0] - "scriptId") match {
                // Check if the `o.value` is an Object if it is create a new object with the same key
                // while the value is a new object
                case o if (o.value is Object) -> {(k): { 
                    // add all fields from the object you are testing but the `internalId` and the `value`
                    (o -- ["internalId","value"]),
                    // add `internalId1` mapped to the top object's `internalId` field
                    internalId1: o.internalId,
                    // add `internalId2` mapped to the object stored in the `o.value.internalId`
                    internalId2: o.value.internalId,
                    // add all fields from the `o.value` but the `internalId`
                    (o.value - "internalId"),
                    // Finally just add `value: false to the new object
                    value: false    
                }}
                // When `o.value` is not an object then keep it as is.
                else -> {(k): $}
            }
        )
    })
}
© www.soinside.com 2019 - 2024. All rights reserved.