You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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>

关键改动说明

  1. 字段映射修正:输入JSON的键包含空格(如"Product ID"),原代码中item.ProductID会报错,改为item."Product ID"正确访问字段。
  2. 动态表头生成:用定义好的headers数组遍历生成标签,避免硬编码,同时单独为"Product Number"设置蓝色边框样式,匹配需求。
  3. 动态数据行生成:用tableData map遍历所有数据项,为每个项生成一个标签,再遍历表头数组生成对应的标签,自动适配数组长度。
  4. 逻辑修正:原代码中Combo字段判断改为匹配输入的"Combo?"字段,确保逻辑正确。

内容的提问来源于stack exchange,提问作者Triumph Spitfire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:06:57