你有一个可以序列化为 JSON 数据的对象,但它不是 JSON 本身。让我解释一下区别。
以下sn-ps是Javascript。
这是一个可以序列化为 JSON 的 Javascript 对象示例
{ x: 2 }
以下字符串是 JSON 格式数据的示例。 (请注意,JSON 数据本身只是一个以特定方式格式化的字符串。JSON 始终只是一个字符串,就像 XML 一样)
'{"x":2}'
以下是将 Javascript 对象序列化为 JSON 格式的示例(即我们将对象转换为 JSON 字符串)。
> JSON.stringify({ x: 2 })
'{"x":2}'
看到区别了吗?你会发现很多人在网上称 JSON 可序列化数据为“JSON”(这很好,有时人们说话会变得懒惰,或者不完全理解),但从技术上讲,它不是 JSON,它只是可以转换成的数据JSON 如果需要(例如,具有函数的对象不是 JSON 可序列化的 - 你真的不能将函数编码为字符串)。
话虽如此,你所得到的只是一个 Javascript 的 sn-p,如果执行它将把一个 JSON 可序列化的对象放入一个变量中。 然而,此源代码本身不包含格式正确的 JSON 数据(例如,引号必须是双引号 - JSON 中不允许使用单引号)。因此,没有 JSON 解析实用程序能够对其进行操作。
不幸的是,您将不得不手动解析这些数据,这可能需要做一些工作。工作量取决于您的需求。如果您想要做的只是从该数据中提取一个特定属性,那么可能只需对适当的键进行正则表达式搜索,然后提取值(不过,您必须知道 您要查找的键不会出现在对象的其他任何位置)。
更新:
如果您只想提取 JSON 数据并将其保存在其他地方,那么使用 Javascript 而不是 python 可能会更好,因为您正在处理的是 Javascript 源代码。这是您可以执行的操作。
编辑 HTML 文件并取出除此 JSON 可序列化结构之外的所有内容,将 window.INIT_STATE 更改为 const INIT_STATE,并在文件末尾添加以下内容:
const INIT_STATE = ...your giant JSON-serializable structure...
require('fs').writeFileSync('./output.json', JSON.stringify(INIT_STATE), 'utf-8')
将您的 html 文件重命名为具有“.js”文件扩展名。
您需要安装节点才能运行它。安装节点后,使用node yourFile.js 运行文件。它应该在您的同一目录中创建一个名为“output.json”的文件。