DataWeave 2.0嵌套数组转换

时间:2020-02-21 20:17:20

标签: arrays dataweave mulesoft

我正在尝试使用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"
            }
        }

    ]
}

3 个答案:

答案 0 :(得分:2)

结构可能有点复杂,最好简化一下,但是我发现的真正问题是试图从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避免在属性为null时发出贷方和借方属性。

答案 1 :(得分: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): $}
            }
        )
    })
}

答案 2 :(得分:0)

这是另一个答案...希望有帮助

%dw 2.2
output application/json
var inpJson={
    "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
                    }
                ]

            }
        }

    ]
}
---
inpJson.line map(v1,k1) ->
{
    (v1 mapObject(v2,k2) ->
    {
        (k2):v2 
    } - "customFieldList"
    ),
    (v1.customFieldList.customField map (v3, k3) ->
                {
                    (v3.scriptId): {
                        value: v3.value,
                        internalId: v3.internalId
                    }
                }
        )   
}