我们都知道我们可以使用 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/