3 回答

TA贡献1951条经验 获得超3个赞
刮is将是丑陋的。假设您要解析的字符串有一些假设,您可以:
提取被推入数组的部分
将该字符串转换为有效的JSON:
将字符串文字的定界单引号替换为双引号;
用双引号将未加引号的属性名称引起来;
删除最后一个属性后的结尾逗号
为了可靠地做到这一点,您必须编写一个与JSON解析器一样复杂的解析器,但是在某些假设的情况下,它可能可以简化为:
// Sample data
var someCrawledJSCode = `
const somecode = 'somevalue';
arr.push({
data1: {
prices: [{
prop1: 'hi',
prop2: 'hello',
},
{
prop1: 'foo',
prop2: 'bar',
}]
}
});`;
var obj;
var notJson = someCrawledJSCode.replace(/\.push\(([^]*?)\)/, (_, notJson) => {
// Try to turn the string into valid JSON:
// 1. string literals should not be enclosed in single, but double quotes
// 2. property names should be enclosed in double quotes
// 3. there should be no trailing comma after the last property
var json = notJson.replace(/'((\\.|[^\\'])*)'/g, '"$1"')
.replace(/(\w+):/g, '"$1":')
.replace(/,\s*}/g, "}");
obj = JSON.parse(json);
});
console.log(obj);
事情仍然可能出错,但是至少您没有使用eval
。例如,如果您的字符串文字具有与content匹配的内容(\w+):
,则上述内容将更改该字符串。当然可以使解析更可靠...
添加回答
举报