JSON解析文件在node / express中返回字符串而不是Array

时间:2018-05-10 09:11:17

标签: javascript arrays json node.js express

我在尝试从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
&#13;
&#13;
&#13;

解决!

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

3 个答案:

答案 0 :(得分:3)

这是正常的,文件格式不正确,您必须删除引号。

[]

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

答案 1 :(得分:1)

通过最佳猜测发生了什么:

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

就解析器而言,它正在解析字符串并返回字符串。 (就像做JSON.parse('\"[]\"');

readFile读取的任何文件都将成为一个字符串。因此,将空数组保留为[]而不使用JSON文件中的引号

就足够了

答案 2 :(得分:0)

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

enter image description here

enter image description here