Javascript:将JSON对象数组构造为脚本时出现问题
我正在创建一个本地html页面,作为我用youtube dl下载的视频的查看器。为了让观看者工作,它需要能够访问视频元数据。当youtube dl使用批处理操作将json作为下载完成后,我可以轻松地将元数据输出通过管道传输到单个文本文件中。该文件如下所示,每行有一个不同的json对象:Javascript:将JSON对象数组构造为脚本时出现问题,javascript,command-line,Javascript,Command Line,我正在创建一个本地html页面,作为我用youtube dl下载的视频的查看器。为了让观看者工作,它需要能够访问视频元数据。当youtube dl使用批处理操作将json作为下载完成后,我可以轻松地将元数据输出通过管道传输到单个文本文件中。该文件如下所示,每行有一个不同的json对象: {Id: "jYDgJjGfha", description: "This video isn't good at all"} {Id: "JDRegIIGfj", description: "This vide
{Id: "jYDgJjGfha", description: "This video isn't good at all"}
{Id: "JDRegIIGfj", description: "This video is terrible"}
{Id: "VkdwjDoG", description: "Why am I downloading these?"}
但是,由于跨源保护,我不可能在html查看器页面上获取该文件
有人建议我不要尝试将包含元数据的文本文件加载到我的页面中,而是将元数据转换为有效的脚本,并使用脚本标记加载它(例如,
)
在批处理文件中,很容易使文件的第一行等于const database=[
,并在每次输出一行json时附加一个逗号。这就是包含元数据的文件现在的样子:
const database = [
{Id: "jYDgJjGfha", description: "This video isn't good at all"},
{Id: "JDRegIIGfj", description: "This video is terrible"},
{Id: "VkdwjDoG", description: "Why am I downloading these?"},
但是,我没有办法关闭此阵列。因为对于批处理文件运行时可用的每个新视频,都需要追加新行。我也无法使用需要将整个元数据文件加载到内存中的解决方案,因为它是一个非常大的文件
我已经想到了几种不同的方法来构造元数据脚本文件,但它们似乎都不能完全满足我的需要:
例如:这种方法可能有效,但在批处理文件中追加行时,我无法找到要设置行的正确索引
const database = [];
database[0] = {Id: "jYDgJjGfha", description: "This video isn't good at all"};
database[1] = {Id: "JDRegIIGfj", description: "This video is terrible"};
database[2] = {Id: "VkdwjDoG", description: "Why am I downloading these?"};
这种方法肯定会奏效,但我担心它在我的大文件上的性能:
const database = [];
database.push(database [I] = {Id: "jYDgJjGfha", description: "This video isn't good at all"});
database.push({Id: "JDRegIIGfj", description: "This video is terrible"});
database.push({Id: "VkdwjDoG", description: "Why am I downloading these?"});
是否有不同的方法可以构造元数据脚本文件,使其成为有效的脚本
编辑
通过将批处理文件更改为PowerShell脚本,我实际上能够实现最初想要的文件结构。
我已将@lima_fil的答案标记为正确,因为它仍然是我问题的有效答案,可以帮助其他人解决问题。玩字符串可以给你更多的自由。例如: 创建字符串而不是数组,然后将其转换为数组
var dbString = '[null'
+ ',{"Id": "JDRegIIGfj", "description": "This video is terrible"}'
+ ',{"Id": "VkdwjDoG", "description": "Why am I downloading these?"}'
然后将其转换为数组:
var dbArray = JSON.parse(window.dbString + ']');
请注意,对象应为JSON格式{“key”:“value”}。使用字符串可以给您更多自由。例如: 创建字符串而不是数组,然后将其转换为数组
var dbString = '[null'
+ ',{"Id": "JDRegIIGfj", "description": "This video is terrible"}'
+ ',{"Id": "VkdwjDoG", "description": "Why am I downloading these?"}'
然后将其转换为数组:
var dbArray = JSON.parse(window.dbString + ']');
请注意,对象应为JSON格式{“key”:“value”}.
但是,由于跨源保护,我无法在html查看器页面上获取文件。
如果您控制服务器,跨源不是问题。很抱歉,我应该指定,这仅用于本地html文件。现在有服务器,将来也不会有服务器。是否有不使用浏览器存储提供程序的原因?如localStorage、sessionStorage甚至indexedb?如果我错了,请纠正我,但我相信,因为我必须对不同的浏览器使用不同的方法。目标是尽可能少的代码。@FunkyKong本地存储的API(其他也适用)是标准化的,即您将在最流行的浏览器中以相同的方式使用它。如果您需要保存数据(会话)那么,可能您需要的是存储,否则您启动实现的方式可能会更好。但是,由于跨源保护,我无法在html查看器页面上获取该文件。
如果您控制服务器,跨源不是问题。很抱歉,我应该指定,这是针对上的本地html文件的ly.现在有服务器,将来也不会有服务器。不使用浏览器存储提供程序有什么原因吗?比如localStorage、sessionStorage甚至indexedb?如果我错了,请纠正我,但我相信,因为我必须对不同的浏览器使用不同的方法。目标是尽可能少的代码。@FunkyKong localStorage的API就是一个例子(也适用于其余部分)是标准化的,即您将在最流行的浏览器中以相同的方式使用它。如果您需要保存数据(会话),则可能需要存储,否则您开始实施的方式可能会更好。