如何阻止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
相关产品推荐
相关产品推荐

