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

如何阻止Node/Express端点重复序列化SQL Server返回的JSON列

解决Express中SQL Server JSON字段返回带转义引号的问题

方案1:利用mssql库的内置JSON解析配置

如果你用mssql包连接SQL Server,直接在连接配置里开启parseJSON选项,就能让库自动把JSON字符串解析成JS对象,省去手动遍历的麻烦:

const sql = require('mssql');

const config = {
  user: '你的用户名',
  password: '你的密码',
  server: '你的服务器地址',
  database: '目标数据库',
  options: {
    parseJSON: true // 关键配置,开启后自动解析JSON类型字段
  }
};

async function fetchData() {
  await sql.connect(config);
  const result = await sql.query('SELECT ColumnA, ColumnB FROM YourTable FOR JSON PATH');
  // 此时result.recordset中的ColumnB已经是JS对象,而非带转义的字符串
  return result.recordset;
}

方案2:全局中间件统一处理响应结果

如果不想修改数据库连接配置,或者使用其他数据库客户端,可以写一个Express全局中间件,自动遍历响应数据并解析指定JSON字段:

app.use((req, res, next) => {
  const originalJson = res.json;
  res.json = function(data) {
    // 按需调整要解析的字段名,这里以ColumnB为例
    const parsedData = Array.isArray(data) 
      ? data.map(item => {
          if (item.ColumnB && typeof item.ColumnB === 'string') {
            try {
              item.ColumnB = JSON.parse(item.ColumnB);
            } catch (e) {
              // 解析失败时保留原字符串,避免中断请求
              console.error('ColumnB解析失败:', e);
            }
          }
          return item;
        })
      : data;
    return originalJson.call(this, parsedData);
  };
  next();
});

之后直接调用res.json(queryResult)即可,无需每次手动处理数据。

方案3:SQL端补充验证(可选)

虽然你确认SQL端无问题,但可以再检查下查询写法,确保ColumnB以原生JSON类型返回:

SELECT ColumnA, JSON_QUERY(ColumnB) AS ColumnB FROM YourTable FOR JSON PATH;

JSON_QUERY会明确告知SQL Server该字段为原生JSON,避免被二次转义。若已确认SQL返回正常,此步骤可忽略。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:05:58