如何提取字符串形式的非JSON格式JavaScript对象?
解决非标准JSON字符串转JavaScript对象的问题
你遇到的核心问题是拿到的字符串是非标准JSON格式——JSON要求对象的键必须用双引号包裹,但你的字符串里的键(比如name、code)都是裸写的,所以JSON.parse无法识别。下面给你几个可行的解决方法,按安全优先级排序:
方法1:使用JSON5库(推荐,安全可靠)
JSON5是JSON的超集,支持非标准的语法(比如键不加引号、单引号字符串、尾逗号等),完美适配你的场景,而且不需要用风险较高的eval。
如果是Node.js项目,先安装JSON5:
npm install json5
然后在代码里使用:
const JSON5 = require('json5'); // 假设你截取后的字符串是objStr var objStr = resp.substring(0, resp.length-9); // 先去掉外层包裹的双引号 var cleanStr = objStr.slice(1, -1); // 用JSON5解析 var resultObj = JSON5.parse(cleanStr);
浏览器环境的话,可以直接引入JSON5的CDN脚本,用法完全一致。这个方法对复杂结构(比如嵌套数组、多层对象)都能完美处理,且没有代码注入风险。
方法2:使用eval(仅当完全信任API返回内容时用)
如果API是你自己控制的,或者能100%保证返回内容安全,可以用eval来解析。注意要给字符串加括号,避免被当成代码块解析:
var objStr = resp.substring(0, resp.length-9); var cleanStr = objStr.slice(1, -1); // 加括号让eval把它当成对象字面量表达式 var resultObj = eval(`(${cleanStr})`);
⚠️ 重要提醒:如果API返回的内容不可信(比如被篡改过),eval会执行里面的任意代码,带来严重的安全风险,所以非必要不要用这个方法。
方法3:手动转换为标准JSON(适合简单结构)
如果不想引入第三方库,可以用正则表达式给所有裸键加上双引号,转换成标准JSON后再用JSON.parse解析:
var objStr = resp.substring(0, resp.length-9); var cleanStr = objStr.slice(1, -1); // 正则匹配裸键,替换成带双引号的键 var standardJson = cleanStr.replace(/([a-zA-Z_$][a-zA-Z0-9_$]*)(?=\s*:)/g, '"$1"'); var resultObj = JSON.parse(standardJson);
这个方法的局限性:如果你的字符串里包含类似键的内容(比如某个字符串值是"name: test"),正则可能会误替换,导致解析失败。所以只推荐结构简单、没有复杂字符串内容的场景使用。
内容的提问来源于stack exchange,提问作者Jalu
相关产品推荐
相关产品推荐

