C# WebAPI遍历JSON数组生成指定格式HTML表格的问题
问题场景
需开发一个POST接口,请求成功后将提交的POST数据拼接为HTML表格发送通知邮件。
问题描述
现有请求体中Submitter数组包含两个对象,分别存储Obj1、Obj2两组字符串列表。当前遍历逻辑生成的HTML表格会将同一列表内的所有元素横向排列在同一行,不符合预期。
预期效果:Obj1和Obj2的元素按索引一一对应,第N个元素放在同一行的两列中展示。
测试示例
测试JSON数据
{ "Submitter": [ {"Obj1": ["苹果", "香蕉", "橙子"]}, {"Obj2": ["red", "yellow", "orange"]} ] }
问题代码示例(Node.js 环境)
// 错误遍历逻辑示例 const postData = req.body; const obj1List = postData.Submitter[0].Obj1; const obj2List = postData.Submitter[1].Obj2; let htmlTable = `<table border="1"><tr><th>Obj1</th><th>Obj2</th></tr>`; // 错误点:分别将两个数组整体拼接为单行的多个单元格 htmlTable += `<tr><td>${obj1List.join('</td><td>')}</td><td>${obj2List.join('</td><td>')}</td></tr>`; htmlTable += `</table>`;
实际输出HTML
<table border="1"> <tr><th>Obj1</th><th>Obj2</th></tr> <tr> <td>苹果</td><td>香蕉</td><td>橙子</td> <td>red</td><td>yellow</td><td>orange</td> </tr> </table>
渲染后所有元素挤在同一行,列结构完全错乱。
预期输出HTML
<table border="1"> <tr><th>Obj1</th><th>Obj2</th></tr> <tr><td>苹果</td><td>red</td></tr> <tr><td>香蕉</td><td>yellow</td></tr> <tr><td>橙子</td><td>orange</td></tr> </table>
修复方案
核心逻辑改为按索引同步遍历两个数组,每组同索引的元素单独生成一行:
const postData = req.body; const obj1List = postData.Submitter[0].Obj1; const obj2List = postData.Submitter[1].Obj2; let htmlTable = `<table border="1"><tr><th>Obj1</th><th>Obj2</th></tr>`; // 取两个数组的最大长度,兼容长度不一致的边界场景 const maxLen = Math.max(obj1List.length, obj2List.length); for(let i = 0; i < maxLen; i++) { const val1 = obj1List[i] ?? ''; const val2 = obj2List[i] ?? ''; htmlTable += `<tr><td>${val1}</td><td>${val2}</td></tr>`; } htmlTable += `</table>`;
其他开发语言逻辑同理,仅语法存在差异,以下为Python示例:
obj1_list = post_data['Submitter'][0]['Obj1'] obj2_list = post_data['Submitter'][1]['Obj2'] max_len = max(len(obj1_list), len(obj2_list)) html_table = '<table border="1"><tr><th>Obj1</th><th>Obj2</th></tr>' for i in range(max_len): val1 = obj1_list[i] if i < len(obj1_list) else '' val2 = obj2_list[i] if i < len(obj2_list) else '' html_table += f'<tr><td>{val1}</td><td>{val2}</td></tr>' html_table += '</table>'
内容的提问来源于stack exchange,提问作者yush
相关产品推荐
相关产品推荐

