猿问

如何在JavaScript代码中获取JavaScript对象?

我想要parseParameter像下面的代码那样解析JSON。 someCrawledJSCode被抓取的JavaScript代码。


const data = parseParameter(someCrawledJSCode);

console.log(data);  // data1: {...}

问题

我正在使用puppeteer抓取一些JavaScript代码,并且想从中提取JSON对象,但是我不知道如何解析给定的JavaScript代码。


抓取的JavaScript代码示例:


const somecode = 'somevalue';

arr.push({

  data1: {

    prices: [{

      prop1: 'hi',

      prop2: 'hello',

    },

    {

      prop1: 'foo',

      prop2: 'bar',

    }]

  }

});

在这段代码中,我想获取prices数组(或data1)。


我做了什么

我尝试将代码解析为JSON,但无法正常工作。因此,我搜索了解析工具并获得了Esprima。但是我认为这对解决这个问题没有帮助。


慕仙森
浏览 190回答 3
3回答

饮歌长啸

刮is将是丑陋的。假设您要解析的字符串有一些假设,您可以:提取被推入数组的部分将该字符串转换为有效的JSON:将字符串文字的定界单引号替换为双引号;用双引号将未加引号的属性名称引起来;删除最后一个属性后的结尾逗号为了可靠地做到这一点,您必须编写一个与JSON解析器一样复杂的解析器,但是在某些假设的情况下,它可能可以简化为:// Sample datavar 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+):,则上述内容将更改该字符串。当然可以使解析更可靠...
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答