javascript - 如何将类 JSON(不是 JSON)字符串转换为对象?

标签 javascript json

我们都知道我们可以使用 JSON.parse()转换字符串 '{"a":0,"b":"haha"}'到对象 {a: 0, b: 'haha'} .

但是我们可以转换字符串'{a: 0, b: "haha"}'吗?到对象 {a: 0, b: 'haha'}

我正在写一个网络爬虫,我需要获取页面中的数据。但是完整的数据不在 DOM 中,而是在一个 <script> 中。元素。所以我在<script>中得到了有用的内容并将该字符串(如 'window.Gbanners = [{...}, {...}, {...}, ...];' )转换为类似 JSON 的字符串(如 '{banners : [...]}' )。但是,我无法解析“类似 JSON”的字符串。有没有人有办法解决吗?

最佳答案

{a: 0, b: "haha"}这样的字符串不是JSON,而是一堆JavaScript代码。

获取内部数据的 JSON 表示的最佳方法是通过 JS 解析器(例如 Esprima )运行它,遍历语法树并从中构建一个 json 对象。这需要一些工作,但至少您可以正确地完成解析,并正确处理转义序列。

这是一个起点:

const esprima = require("esprima");
const code = '({a: 0, b: "haha"})';
const ast = esprima.parse(code);

const properties = ast.body[0].expression.properties;
const output = properties.reduce((result, property) => { 
  result[property.key.name] = property.value.value;
  return result;
}, {});
console.log(output);

这段代码假设了很多关于输入代码的样子——对于原型(prototype)来说可能没问题,但仍然需要错误检查和处理嵌套对象。

(更通用的方法可能涉及一个递归函数,该函数采用 ObjectExpression 并返回等效的 JSON。)

我还必须将您的输入括在括号中,以便根据 JS 语法它是一个表达式(而不是 block 语句)。

关于javascript - 如何将类 JSON(不是 JSON)字符串转换为对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49112325/

相关文章:

javascript - Axios 拦截器请求在 VueJs 中过期时刷新 id token

javascript - getElementById 神秘地返回 URL

javascript - 从它调用的函数中中止外部函数

javascript - 计算可标记好友 Facebook API

node.js - 如何在 Angular 中将字符串转换为 json?

javascript - 在 JavaScript 中动态创建 JSON 数组键

json - JSON 对象中 @type 的位置导致错误

javascript - 带 JavaScript 的单选按钮

javascript - jQuery .each 循环不循环,但当你 console.log 时却循环?

jquery - 如何使用 Jquery ajax 读取雅虎天气 JSON 数据