如何在应用逻辑中转换Log Analytics返回JSON为Adaptive Cards格式
Log Analytics API返回结果转自适应卡片实现方案
核心逻辑:列结构固定的场景下不需要做动态列映射,按列索引遍历填充行数据即可,避免多层嵌套循环组装时的索引错位问题。
前置处理
首先解析HTTP请求拿到的JSON响应,直接取第一个表作为主结果集:
- Log Analytics查询接口返回的结果中,
tables[0]固定为查询对应的主结果PrimaryResult - 提取其中的
columns数组存为列配置,rows数组存为动态行数据,行数不需要提前固定,循环自动适配
可直接复用的转换代码(JavaScript通用版)
转换完成的结果可以直接存在变量中,后续作为Webhook POST请求的body使用:
// 替换为你从HTTP响应中拿到的原始JSON对象 const logAnalyticsResp = { "tables": [ // 你的原始返回结果 ] }; const primaryResult = logAnalyticsResp.tables[0]; const { columns, rows } = primaryResult; // 初始化目标自适应卡片结构 const adaptiveCardResult = { "type": "ColumnSet", "columns": [] }; // 按列索引遍历组装 for (let colIdx = 0; colIdx < columns.length; colIdx++) { const currentCol = { "type": "Column", "items": [ // 第一行固定为加粗的列名 { "type": "TextBlock", "text": `**${columns[colIdx].name}**` } ] }; // 遍历所有行,填充当前列对应的单元格内容 for (const row of rows) { currentCol.items.push({ "type": "TextBlock", "text": String(row[colIdx]) // 统一转字符串,兼容数字、时间类型,避免渲染报错 }) } adaptiveCardResult.columns.push(currentCol); } // adaptiveCardResult即为最终需要的结构,可直接存储调用
适配说明
- 支持任意动态行数,返回0行、数十行数据都可以正常生成结构
- 数值、时间类型字段统一转字符串,规避不同自适应卡片渲染端的类型校验问题
- 后续如果需要新增固定列,只需要调整Log Analytics的查询语句,不需要修改转换逻辑
内容的提问来源于stack exchange,提问作者Yugo
相关产品推荐
相关产品推荐

