JavaScript中如何将字符串格式的API对象转换为JSON文件对象
问题描述
现有接口返回非标准格式的类JS对象字符串,示例原始返回内容如下:
obj = "{ club: { title: 'CLUB-Rs 300', rows: '2', columns: 15, price: 300, name: 'club', }, executive: { title: 'Executive-Rs 200', rows: '8', columns: 15, price: 200, name: 'executive', }, }"
需要将该字符串转换为标准可使用的JSON对象。
实现方案
这类字符串属于未做标准化处理的JS对象字面量格式,和标准JSON的差异主要是三点:键名未包裹双引号、字符串值用单引号包裹、属性末尾存在多余尾逗号,针对不同使用场景可以选择以下两种实现方式:
方案1:JS运行环境无依赖快速实现(前端/Node.js适用)
不需要手动做字符串替换,直接通过Function构造器解析即可,容错率远高于正则替换:
// 此处rawApiResp为接口返回的原始字符串内容 const rawApiResp = `{ club: { title: 'CLUB-Rs 300', rows: '2', columns: 15, price: 300, name: 'club', }, executive: { title: 'Executive-Rs 200', rows: '8', columns: 15, price: 200, name: 'executive', }, }` // 直接解析为标准JS对象 const parsedData = (new Function(`return ${rawApiResp}`))() // 如需输出标准JSON格式字符串 const standardJsonStr = JSON.stringify(parsedData, null, 2)
注意事项:
- 该方法仅适用于接口返回内容完全可信的内部场景,禁止用该方法解析不可信第三方来源的字符串,避免代码注入风险
- 解析完成后可以直接通过
parsedData.club、parsedData.executive读取对应字段内容
方案2:正则替换通用方案(跨语言适用)
如果在Python、Java等非JS运行环境下处理,可以先通过正则修正字符串格式,再用对应语言的原生JSON解析方法处理,以JS环境为例的实现代码如下:
function parseNonStandardJson(str) { // 移除原始字符串外层的变量赋值、包裹引号等冗余内容 let processed = str.trim().replace(/^.*?=\s*['"]|['"]\s*;?$/g, '') // 给未加引号的键名补充双引号 processed = processed.replace(/([{,]\s*)([a-zA-Z0-9_]+)\s*:/g, '$1"$2":') // 将单引号包裹的字符串值替换为双引号包裹 processed = processed.replace(/'/g, '"') // 移除属性末尾多余的尾逗号,兼容低版本JSON解析器 processed = processed.replace(/,\s*([}\]])/g, '$1') // 解析为标准对象 return JSON.parse(processed) } // 调用示例 const result = parseNonStandardJson(obj)
两种方案最终解析得到的标准JSON结构如下:
{ "club": { "title": "CLUB-Rs 300", "rows": "2", "columns": 15, "price": 300, "name": "club" }, "executive": { "title": "Executive-Rs 200", "rows": "8", "columns": 15, "price": 200, "name": "executive" } }
内容的提问来源于stack exchange,提问作者Anmee senn
相关产品推荐
相关产品推荐

