DataWeave中读取嵌套数组并生成目标JSON数组的实现方法
解决DataWeave遍历子数组生成目标JSON数组的问题
需要将包含子数组的源JSON数组转换为目标JSON数组,要求每个ExpenseReportDetailArray的子元素都对应目标数组中的一个对象,同时携带父级的ReportName信息。
源JSON数组
[ { "ExpenseReportHeader": { "ReportName": "Jane Zoe ExpensesX" }, "ExpenseReportDetailArray": [ { "CityStart": "CLT", "CityEnd": "AUS" }, { "CityStart": "AUS", "CityEnd": "CLT" } ] }, { "ExpenseReportHeader": { "ReportName": "Jane Zoe ExpensesY" }, "ExpenseReportDetailArray": [{ "CityStart": "CLT", "CityEnd": "AUS" }] } ]
目标JSON数组
[ { "Name": "Jane Zoe ExpensesX", "SourceCity": "CLT", "DestinationCity": "AUS" }, { "Name": "Jane Zoe ExpensesX", "SourceCity": "AUS", "DestinationCity": "CLT" }, { "Name": "Jane Zoe ExpensesY", "SourceCity": "CLT", "DestinationCity": "AUS" } ]
错误的DataWeave代码
%dw 2.0 output application/java --- payload map ( payload01 , indexOfPayload01 ) -> { Name: payload01.ExpenseReportHeader.ReportName, payload01 map () -> { SourceCity: payload01.ExpenseReportDetailArray.CityStart, DestinationCity: payload01.ExpenseReportDetailArray.CityEnd } }
错误原因:
- 使用
map嵌套会生成嵌套结构的数组,无法得到扁平化的目标数组 - 内层
map遍历的是父对象而非子数组ExpenseReportDetailArray,无法正确获取子元素的城市字段
正确的DataWeave代码
%dw 2.0 output application/json // 若需输出Java可改为application/java --- payload flatMap (headerItem) -> headerItem.ExpenseReportDetailArray map (detailItem) -> { Name: headerItem.ExpenseReportHeader.ReportName, SourceCity: detailItem.CityStart, DestinationCity: detailItem.CityEnd }
代码说明:
flatMap:遍历源数组的每个父对象,将每个父对象生成的子数组合并为一个单一数组,实现扁平化输出- 内层
map:遍历当前父对象的ExpenseReportDetailArray子数组,为每个子元素生成目标对象 - 每个目标对象中,
Name取自父对象的ReportName,SourceCity和DestinationCity取自当前子元素的对应字段
内容的提问来源于stack exchange,提问作者Priya Singh
相关产品推荐
相关产品推荐

