Разобранный JSON файл возвращает строку вместо массива в узле / экспрессе - PullRequest
0 голосов
/ 10 мая 2018

У меня возникают проблемы при попытке анализа пустого (строкового) массива из файла 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 в другом месте, они оба пытались получить доступ к файлу одновременно. Я изменил это, чтобы написать FileSync, и проблема решена!

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

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

[]

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

0 голосов
/ 10 мая 2018

По гаданию, что происходит:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...