【问题标题】:JSON parsed file returning string instead of Array in node/expressJSON解析文件返回字符串而不是节点/快递中的数组
【发布时间】:2018-10-20 12:20:57
【问题描述】:

我在尝试从 JSON 文件解析空(字符串化)数组时遇到问题,我得到的是字符串,而不是返回空数组。

我的 JSON 文件初始设置是:

"[]"

我正在使用文件系统将解析的数据分配给一个变量

let parsedObjs = JSON.parse(fs.readFileSync(__dirname + '/data/employees.json'));

当我在浏览器控制台中尝试这个时,我得到了一个空数组,正如我所期望的:

JSON.parse("[]")
> []

但是,在 Node/Express 中,我得到了一个返回的字符串:

console.log(type of:', typeof parsedObjs);
> type of: string

奇怪的是,如果我将初始文件设置为未字符串化的数组,它会返回一个数组:

> []

当然,这会产生“JSON 意外结束”错误。

我对此很陌生,请告诉我我做错了什么。谢谢。

额外信息

完整的功能:

function populateSelectors(selector) {
  let foundOptions = [];
  let parsedObjs = JSON.parse(fs.readFileSync('./data/employees.json'));

  parsedObjs.forEach(obj => {
      let key = Object.keys(obj)[0];
      let optionName = obj[key][selector];
      if (foundOptions.indexOf(optionName) === -1 ) {
          foundOptions.push(optionName);
      }
  });
  return foundOptions;
}

完全错误(我显然已将完整路径更改为):

SyntaxError: Unexpected end of JSON input
application.js:630
    at JSON.parse (<anonymous>)
    at Object.populateSelectors (<FULL PATH>\Rota Application 2\staff.js:14:27)
    at <FULL PATH>\Rota Application 2\app.js:45:28
    at Layer.handle [as handle_request] (<FULL PATH>\Rota Application 2\node_modules\express\lib\router\layer.js:95:5)
    at next (<FULL PATH>\Rota Application 2\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (<FULL PATH>\Rota Application 2\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (<FULL PATH>\Rota Application 2\node_modules\express\lib\router\layer.js:95:5)
    at <FULL PATH>\Rota Application 2\node_modules\express\lib\router\index.js:281:22

已解决!

问题是我在别处有一个 writeFile 方法,他们都试图同时访问该文件。我把它改成 writeFileSync 问题解决了!

【问题讨论】:

    标签: javascript arrays json node.js express


    【解决方案1】:

    正常,文件格式不对,必须去掉引号。

    []

    JSON.parse("[]") 使用引号,因为您必须将字符串传递给解析函数。

    【讨论】:

    • 我明白了,谢谢。如何在避免导致 JSON 错误(“JSON 输入意外结束”)的同时做到这一点?
    【解决方案2】:

    对正在发生的事情的最佳猜测:

    如果您将空数组作为"[]" 存储在文件中,当您在节点JS 中读取它时,解析看到的字符串将如下所示:"\"[]\""

    所以就解析器而言,它正在解析一个字符串并返回该字符串。 (喜欢做JSON.parse('\"[]\"');

    readFile 读取的任何文件都将是一个字符串。因此,将空数组保留为 [] 就足够了,而 JSON 文件中没有引号

    【讨论】:

    • 我明白了,谢谢。如何在避免导致 JSON 错误(“JSON 输入意外结束”)的同时做到这一点?
    • 我不确定为什么会这样。我尝试了一个快速 PoC,其中包含一个只有 [] 的文件。我尝试像这样解析它:var x = JSON.parse(fs.readFileSync('./t.json')),它按预期工作。你能分享你的电话和完整的错误吗?我在问题中看到了其中的一些内容,但令人困惑,因为存在如下语法错误:console.log(type of:', typeof parsedObjs);
    • 您可以尝试的另一个选项是node-fs-extra 包,它为原生fs 模块提供了一个包装器,以包含readJsonSync 等便利方法
    • 我的帖子写得有点混乱,“console.log(type of:', typeof parsedObjs);”不是错误,我只是在演示代码行和下面的结果。我已经添加了您要求的其他信息。同时我会尝试 node-fs-extra。
    • 我刚刚尝试了 fs-extra,但奇怪的是我得到了同样的错误。
    【解决方案3】:

    我遇到了同样的问题,然后我意识到了错误。我将字符串"[]" 字符串化,而不是对象[]

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2011-05-13
      • 2020-10-19
      • 2019-11-01
      • 2019-01-19
      相关资源
      最近更新 更多