Разобранный JSON файл возвращает строку вместо массива в узле / экспрессе

1

У меня возникают проблемы при попытке разобрать пустой (стробированный) массив из файла 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;
}

ERROR in Full (я, очевидно, изменил полный путь):

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, и проблема решена!

Теги:
arrays
express

2 ответа

2

Это нормально, файл не в правильном формате, вы должны удалить кавычки.

[]

JSON.parse("[]") работает с кавычками, потому что вы должны передать строку в функцию синтаксического анализа.

  • 0
    Понятно, спасибо. Как я могу сделать это, избегая при этом возникающей ошибки JSON («Неожиданный конец ввода JSON»)?
1

Лучше догадаться, что происходит:

Если вы сохраняете свой пустой массив как "[]" в своем файле, когда вы читаете его в узле JS, строка, просматриваемая синтаксическим разбором, будет выглядеть так: "\"[]\"".

Итак, что касается анализатора, он разбирает строку и возвращает строку. (Как делать JSON.parse('\"[]\"');)

Любой файл, считанный readFile будет readFile STRING. Поэтому достаточно оставить свой пустой массив как [] без кавычек в вашем файле JSON

  • 0
    Понятно, спасибо. Как я могу сделать это, избегая при этом возникающей ошибки JSON («Неожиданный конец ввода JSON»)?
  • 0
    Я не уверен, почему это произойдет. Я попробовал быстрый PoC с файлом, содержащим только [] . И я попытался разобрать его так: var x = JSON.parse(fs.readFileSync('./t.json')) и он работал как положено. Можете ли вы поделиться своим звонком и полной ошибкой? Я вижу некоторые из них в вопросе, но это сбивает с толку, потому что есть синтаксические ошибки, такие как: console.log(type of:', typeof parsedObjs);
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню