如何将JavaScript对象验证格式化后转换为合法JSON发送至NestJS后端
可选转换方案(按可靠性从高到低排序)
方案1:直接使用原生
JSON.stringify()(优先推荐)
只要你可以在Angular前端代码中直接拿到原始的JS对象,不需要手动做任何字符串处理,原生方法会自动把所有键转为双引号、自动移除尾随逗号,输出完全符合规范的JSON字符串:// 原始配置对象 const config = { service: { port: 3080, }, datasource: { m3: { rest: { url: 'https://se/', username: 'di.com', password: 'B4', }, }, postgraphile: { url: 'https://gl', hostname: 'sg', port: 1133, database: 'MV', username: 'rr', password: '1', }, }, database: { pg: { hostname: 'ss.com', port: 5432, username: 'br', password: '1x', database: 'eb', synchronize: false, }, mssql: { hostname: '10.100.100.100', port: 1133, database: 'MV', schema: 'MA', username: 'rr', password: 'we', }, redis: { url: 'redis:///0', }, }, graphql: { playground: true, }, } // 直接转合法JSON,第三个参数2代表格式化缩进为2空格,不需要格式化可以省略 const validJson = JSON.stringify(config, null, 2)转换后直接把
validJson作为请求体传给NestJS后端即可,NestJS内置的body解析器可以直接解析该格式。方案2:使用
new Function解析JS对象字面量字符串
如果你拿到的不是可直接访问的JS对象,而是带单引号、尾随逗号的对象字面量纯字符串,可以用该方法先把字符串解析为JS对象,再转JSON,注意该方法仅适用于来源可信的字符串:// 你的对象字面量字符串 const objStr = `{ service: { port: 3080, }, // 完整的对象字符串内容 }` // 解析为JS对象,自动兼容JS语法的单引号、尾随逗号 const parsedObj = new Function(`return ${objStr}`)() // 转合法JSON const validJson = JSON.stringify(parsedObj, null, 2)方案3:正则补充处理尾随逗号
如果你要继续用原来的正则处理逻辑,只需要新增一步正则替换,移除多余的尾随逗号即可:var objKeysRegex = /({|,)(?:\s*)(?:')?([A-Za-z_$\.][A-Za-z0-9_ \-\.$]*)(?:')?(?:\s*):/g; var newQuotedKeysString = b.replace(objKeysRegex, "$1\"$2\":"); // 新增:匹配逗号后紧跟}或]的情况,移除多余逗号 const validJsonStr = newQuotedKeysString.replace(/,(\s*[}\]])/g, '$1')注意该方案仅适合结构简单的对象,遇到值内包含特殊符号的复杂场景容易出现匹配错误。
内容的提问来源于stack exchange,提问作者Sadusha Nadeesh
相关产品推荐
相关产品推荐

