如何在MuleSoft中用DataWeave 2.0将JSON数组转为HTML表格?
用DataWeave 2.0将JSON数组转换为指定样式的HTML表格
问题描述
我需要在MuleSoft中用DataWeave 2.0把JSON数组转换成指定样式的HTML表格。输入JSON示例:
[ { "Product ID": "4d5c0b68", "Product Number": "be56", "Product Name": "Product A", "Product Priority": "High Risk", "Product Attachments": 2, "Combo?": "No" }, { "Product ID": "a1b2c3d4", "Product Number": "cd78", "Product Name": "Product B", "Product Priority": "Medium", "Product Attachments": 5, "Combo?": "Yes" } ]
目标HTML输出(支持多行数据):
<table style="width: 50%; border: 1px solid black; font-family: Monospace"> <tr bgcolor="#6c7ae0" style="color: white !important;border: 1px solid black; font-size:14px; "> <th bgcolor="#6c7ae0" style="color: white !important;border: 1px solid black; font-size:14px; ">Product ID</th> <th bgcolor="#6c7ae0" style="color: white !important;border: 1px solid blue; font-size:14px; ">Product Number</th> <th bgcolor="#6c7ae0" style="color: white !important;border: 1px solid black; font-size:14px; ">Product Name</th> <th bgcolor="#6c7ae0" style="color: white !important;border: 1px solid black; font-size:14px; ">Product Priority</th> <th bgcolor="#6c7ae0" style="color: white !important;border: 1px solid black; font-size:14px; ">Product Attachments</th> <th bgcolor="#6c7ae0" style="color: white !important;border: 1px solid black; font-size:14px; ">Combo?</th> </tr> <tr align="center" style="color: #666666; font-size:12px; border: 1px solid black; font-weight: 500; width:10%"> <td style="color: black !important;border: 1px solid black; font-size:14px; ">4d5c0b68</td> <td style="color: black !important;border: 1px solid black; font-size:14px; ">be56</td> <td style="color: black !important;border: 1px solid black; font-size:14px; ">Product A</td> <td style="color: black !important;border: 1px solid black; font-size:14px; ">High Risk</td> <td style="color: black !important;border: 1px solid black; font-size:14px; ">2</td> <td style="color: black !important;border: 1px solid black; font-size:14px; ">No</td> </tr> <tr align="center" style="color: #666666; font-size:12px; border: 1px solid black; font-weight: 500; width:10%"> <td style="color: black !important;border: 1px solid black; font-size:14px; ">a1b2c3d4</td> <td style="color: black !important;border: 1px solid black; font-size:14px; ">cd78</td> <td style="color: black !important;border: 1px solid black; font-size:14px; ">Product B</td> <td style="color: black !important;border: 1px solid black; font-size:14px; ">Medium</td> <td style="color: black !important;border: 1px solid black; font-size:14px; ">5</td> <td style="color: black !important;border: 1px solid black; font-size:14px; ">Yes</td> </tr> </table>
当前代码只能处理单行数据,如何修改成支持整个数组?现有代码如下:
%dw 2.0 output application/xml writeDeclaration=false var tableData = payload map ((item, index) -> { "Product ID" : item.ProductID, "Product Number": item.ProductNumber, "Product Name": item.ProductName, "Product Priority": item.ProductPriority, "Product Attachments": item.ProductAttachments as Number, "Combo?" : if (item.Combo == "false") "No" else "Yes" }) var headerRow = [ { "header": "Product ID", "style": "color: white !important; border: 1px solid black; font-size: 14px;" }, { "header": "Product Number", "style": "color: white !important; border: 1px solid black; font-size: 14px;" }, { "header": "Product Name", "style": "color: white !important; border: 1px solid black; font-size: 14px;" }, { "header": "Product Priority", "style": "color: white !important; border: 1px solid black; font-size: 14px;" }, { "header": "Product Attachments", "style": "color: white !important; border: 1px solid black; font-size: 14px;" }, { "header": "Combo?", "style": "color: white !important; border: 1px solid black; font-size: 14px;" } ] --- <table style="width: 50%; border: 1px solid black; font-family: Monospace"> <tr bgcolor="#6c7ae0" style="color: white !important; border: 1px solid black; font-size: 14px;"> <th bgcolor="#6c7ae0" style="color: white !important; border: 1px solid black; font-size: 14px;">Case #</th> <th bgcolor="#6c7ae0" style="color: white !important; border: 1px solid blue; font-size: 14px;">Interaction #</th> <th bgcolor="#6c7ae0" style="color: white !important; border: 1px solid black; font-size: 14px;">Product Name</th> <th bgcolor="#6c7ae0" style="color: white !important; border: 1px solid black; font-size: 14px;">PQC Priority</th> <th bgcolor="#6c7ae0" style="color: white !important; border: 1px solid black; font-size: 14px;">No. of PQC Attachments</th> <th bgcolor="#6c7ae0" style="color: white !important; border: 1px solid black; font-size: 14px;">Combo?</th> </tr> <tr align="center" style="color: #666666; font-size: 12px; border: 1px solid black; font-weight: 500; width: 10%"> <td style="color: black !important; border: 1px solid black; font-size: 14px;">{(tableData[0]."Product ID")}</td> <td style="color: black !important; border: 1px solid black; font-size: 14px;">{(tableData[0]."Product Number")}</td> <td style="color: black !important; border: 1px solid black; font-size: 14px;">{(tableData[0]."Product Name")}</td> <td style="color: black !important; border: 1px solid black; font-size: 14px;">{(tableData[0]."Product Priority")}</td> <td style="color: black !important; border: 1px solid black; font-size: 14px;">{(tableData[0]."Product Attachments")}</td> <td style="color: black !important; border: 1px solid black; font-size: 14px;">{(tableData[0]."Combo?")}</td> </tr> </table>
解决方案
可以通过DataWeave 2.0完全实现需求,核心是动态遍历数组生成数据行,同时修正现有代码中的字段映射、表头匹配问题。以下是修正后的完整代码:
%dw 2.0 output application/xml writeDeclaration=false // 修正字段映射:输入JSON的键带空格,需用引号或方括号访问 var tableData = payload map ((item) -> { "Product ID" : item."Product ID", "Product Number": item."Product Number", "Product Name": item."Product Name", "Product Priority": item."Product Priority", "Product Attachments": item."Product Attachments" as Number, "Combo?" : if (item."Combo?" == "No") "No" else "Yes" // 匹配输入字段名 }) // 定义表头,单独给Product Number设置蓝色边框样式 var headers = [ { key: "Product ID", style: "color: white !important; border: 1px solid black; font-size:14px;" }, { key: "Product Number", style: "color: white !important; border: 1px solid blue; font-size:14px;" }, { key: "Product Name", style: "color: white !important; border: 1px solid black; font-size:14px;" }, { key: "Product Priority", style: "color: white !important; border: 1px solid black; font-size:14px;" }, { key: "Product Attachments", style: "color: white !important; border: 1px solid black; font-size:14px;" }, { key: "Combo?", style: "color: white !important; border: 1px solid black; font-size:14px;" } ] --- <table style="width: 50%; border: 1px solid black; font-family: Monospace"> <!-- 动态生成表头行 --> <tr bgcolor="#6c7ae0" style="color: white !important;border: 1px solid black; font-size:14px; "> {(headers map ((h) -> <th bgcolor="#6c7ae0" style={h.style}>{h.key}</th> ))} </tr> <!-- 遍历tableData生成所有数据行 --> {(tableData map ((row) -> <tr align="center" style="color: #666666; font-size:12px; border: 1px solid black; font-weight: 500; width:10%"> {(headers map ((h) -> <td style="color: black !important;border: 1px solid black; font-size:14px; ">{row[h.key]}</td> ))} </tr> ))} </table>
关键改动说明
- 字段映射修正:输入JSON的键包含空格(如"Product ID"),原代码中
item.ProductID会报错,改为item."Product ID"正确访问字段。 - 动态表头生成:用定义好的
headers数组遍历生成标签,避免硬编码,同时单独为"Product Number"设置蓝色边框样式,匹配需求。 - 动态数据行生成:用
tableData map遍历所有数据项,为每个项生成一个标签,再遍历表头数组生成对应的标签,自动适配数组长度。 - 逻辑修正:原代码中
Combo字段判断改为匹配输入的"Combo?"字段,确保逻辑正确。
内容的提问来源于stack exchange,提问作者Triumph Spitfire
相关产品推荐
相关产品推荐

